2017-01-23 5 views
1

Ich versuche, die Datenquelle eines Widgets als Ergebnis einer Abfrage zu definieren, aber ich bin mir nicht sicher, ob es möglich ist.Abfrage als Widget Datenquelle

Ich arbeite mit SQL-Ansichten und einer Tabelle, ich möchte die Werte der IDs, die ich in der Tabelle habe, die aus den Ansichten kommen.

function queryValue(source, model, key){ 
    console.log("source " + source); 
    app.datasources[model].query.filters.id._equals = source; 
    app.datasources[model].load(function() { 
    console.log(app.datasources.users.items[0][key]); 
    return app.datasources.users.items[0][key]; 
    }); 
    app.datasources[model].query.clearFilters(); 
} 

aufrufen es wie:

queryValue(@datasource.item.[the_id], "[the_SQLView_Datasouce]", "[the_field_i_want]"); 

In diesem Fall wird das Widget eine Tabelle, so dass die fucntion würde die Menge der Elemente in der talbe wiederholen

Das Problem ist, dass entweder ich das gleiche ergebnis wie meny mal wie die menge an artikeln oder die erste nicht funktioniert!

Und das zweite Problem ist, dass das Ergebnis nicht überschreibt den Widget-Text zu zeigen.

Es ist eine sehr einfache Funktion und ich habe einige Workarounds gefunden, aber nicht mit der Datenquelle Feature und sie arbeiten zu langsam, irgendwelche Vorschläge? Ist es möglich, so etwas mit der Datenquelle zu tun?

+0

Aus dem Screenshot sieht es so aus, als ob Sie versuchen, die ID der Relation anzuzeigen. Wenn Sie zwei Modelle (Tabellen) wie "Employee" und "Manager" haben oder wenn Sie ein Modell des selbstbezogenen Modells "Employee" (Tabelle) haben, können Sie einfach Prefetch für Ihre Datenquelle hinzufügen. In diesem Fall können Sie die Manager ID folgendermaßen binden: @ datasource.item.Manager.Id. Docs: https://developers.google.com/appmaker/models/datasources#prefetch –

+0

Da es eine SQL-Ansicht ist, hat es keine Beziehung, so muss ich von Hand abfragen =) –

+0

In diesem Fall, wenn die Tabelle Ist nur Ansicht, würde ich stattdessen eine berechnete Datenquelle verwenden. Dies reduziert die Anzahl der Aufrufe an Server und Datenbank, so dass Sie die gesamte Seitenleistung verbessern und die blinkenden Labels loswerden. Mit der aktuellen Implementierung, für die Tabelle mit N Zeilen wird App mindestens (N + 1 Aufrufe an den Server) + (N + 1 Aufrufe an die Datenbank). Mit berechneter Datenquelle reduzieren Sie es auf 1 + 1 = 2 Anrufe. –

Antwort

2

Wenn ich die Frage richtig verstehe, möchten Sie wahrscheinlich die Abfrage auf der Serverseite tun. Das Problem mit dem bereitgestellten Beispielcode besteht darin, dass eine Last auf einer einzelnen Datenquelle mehrere Male ausgelöst wird, bevor eine der Lasten zurückkehren kann. Wenn das erledigt ist, wird die Datenquelle nur mit den Ergebnissen von einer der Lasten geladen, ich glaube die letzte. Sie sehen wahrscheinlich die Ergebnisse der letzten Abfrage, die Sie für alle Ihre Rückrufe durchgeführt haben.

Code Anstatt also sollte stattdessen eine serverseitige Skript sein, und so etwas wie sein sollte:

function queryValue(source, model, key){ 
    console.log("source " + source); 
    var query = app.models.newQuery(); 
    query.filters.id._equals = source; 
    var results = query.run; 
    return results[0].key; 
} 

(Geschrieben von Speicher, so verzeiht keine Fehler.)

+0

Danke nochmal Devin! Nach ein paar kleinen Tweeks funktioniert die Lösung! –

2

Nach Devin Vorschlag:

Front-end

/***************************************************************************** 
Front-end function that calls the querying function @queryValue(source, model, key) in controller_TransformId 
@source => the field ID to transform to label 
@model => the model name to be queried 
@key => the label to be acquired with the query 
@wwidget => the widget making the request 
This function works as a model to manage the transactions between the 
controller at the backend and the view. 
******************************************************************************/ 
function buildTransformID(source, model, key, widget){ 
    google.script.run.withSuccessHandler(
    function successHandler(expectedValue){ 
     widget.text = expectedValue;}) 
    .withFailureHandler(
    function failureHandler(){ 
     widget.text = "undefined";}) 
    .queryValue(source, model, key); 
} 

Back-end

/***************************************************************************** 
Back-end function that queries the database 
@source => the field ID to transform to label 
@model => the model name to be queried 
@key => the label to be acquired with the query  
This function works works as a controller to query the database from the backend ******************************************************************************/ 
function queryValue(source, model, key){ 
    var query = app.models[model].newQuery(); 
    query.filters.id._equals = source; 
    var results = query.run(); 
    console.log("CONTROLLER return :" + results[0][key]); 
    return results[0][key]; 
} 

Ist es zwingend erforderlich, den Wert von widget.text zu übergeben? Der successHandler-Callback ist asynchron, so dass normale Returns mir einfach Nullen geben würden

+0

Danke für die Bereitstellung der endgültigen Arbeitslösung! –

Verwandte Themen