Startseite › Foren › Deutsches LiveCode-Forum › Datagrid – auslesen
Schlagwörter: Datagrid
- Dieses Thema hat 53 Antworten und 2 Teilnehmer, und wurde zuletzt aktualisiert vor 6 Jahren, 8 Monaten von Klaus Major.
-
AutorBeiträge
-
-
April 1, 2018 um 11:44 Uhr #4989
Hallo Livecoder,
vielleicht könnt Ihr Profis mir Neuling helfen.
Ich versuche mich gerade an einem Angebotserstellungsprogramm.Ich möchte gerne über ein auf meinem Main stack/card positionierten Textfeld
Daten aus einem Datagrid auslesen. Dieses Datgrid ist auf einer separaten card plaziert. Die Daten (Artikel) werden über eine Importfunktion eingelesen.D.h. Sobald der User anfängt die Artikelnummer im Textfeld einzugeben soll ihm die zur Auswahl verfügbaren Artikel inkl. Texte angezeigt werden (Popup?). Durch Mouse Klick kann er den Artikel komplett übernehmen. Wie greife ich diese Daten ab? Ich habe 7 Columns in meinem Datagrid.
Danke vorab.
Gruß
Andreas
-
April 3, 2018 um 13:31 Uhr #5006
Hallo Andreas,
hier müssen wir Schritt für Schritt vorgehen und benötigen auch ein paar weitere infos von Dir.
1. Die Daten aus einem Datagrid beommen wir auf zwei Arten:
a.
put the dgtext of grp „Dein Datagrid hier“ into TAB_und_CR_getrennter_Text
Ergibt eine Variable TAB_und_CR_getrennter_Text in diesem Format:
zeile1_spalte1 TAB spalte2 TAB spalte3 …
…
zeileN_spalte1 TAB spalte2…b.
put the dgDATA of grp „Dein Datagrid hier“ into ein_Array
Ergibt ein Array ein_Array in diesem Format:
ein_Array[1][spalte1]
ein_Array[1][spalte2]
ein_Array[1][spalte3]
…
ein_Array[N][spalte1]
ein_Array[N][spalte2]
ein_Array[N][spalte3]
…2. So ein „Popup“, also ein Hilfsfeld bei Eingaben wie z.B. in einem Browser, macht m an am besten mit einem LIST Field, was wir unter dem Eingabefeld bei Bedarf auftauchen lassen.
Das Skript dieses Listenfeldes besteht nur aus ein paar Zeilen wie:
on mouseup put the selectedtext of me into fld "wohin auch immer der gewählte Eintrag gehen soll..." ## Wir sind schon fertig, also: hide me end mouseup
Nun kommt es darauf an, welche Spalten Du wie in diesem „Hilfsfeld“ anzeigen lassen möchtest?
Wie ist die Anordnung der Spalten im Datagrid? Seriennummer zuerst?Gib doch einfach mal ein Beispiel, wie Du Dir das so gedacht hast, dannk kümmern wir uns um die Programmierung des eigentlichen Suchfeldes.
Das ist schon ein recht komplexes Problem, aber wir kriegen das hin! 🙂
Gruß
Klaus
-
April 3, 2018 um 14:34 Uhr #5008
Hallo Klaus,
vielen Dank für deine Antwort.
Ich versuche mal das Suchfeld/Popup zu erklären.
Die Daten die im Datagrid (2te Card) gespeichert sind, sind Artikeldaten (Artikelnummer, Bez. 1-4, Mengeneinheit,Preis – Die Columns bleiben immer identisch).
In Card 1 soll der User ein Angebot mit diesen Daten schreiben können.
Dazu soll er in einem Feld beginnen die Artikelnummer oder Bezeichnung einzutippen. Das Feld
soll ihm dann die passenden Artikel zu seiner Eingabe vorschlagen, quasi eine Autovervollständigung.
Durch Doppelklick soll der Artikel dann in das Angebot übernommen werden können.Ich probiere mich jetzt gleich mal an deiner Anleitung. Ich muss das mal Schritt für Schritt nachvollziehen damit ich es auch lerne!
Danke vorab.
Gruß
Andreas
-
April 3, 2018 um 14:40 Uhr #5010
Dein Problem ist mir schon klar, nur ist es sehr wichtig, zu wissen, in welchem Format Du die Daten in dem „Hilfsfeld“ anzeigen lassen möchtest.
Und WELCHE Daten genau?
Den ganzen „Datensatz“ oder z.B. nur den Namen des Produktes?Es soll ja für den User einfach und übersichtlich sein.
-
April 3, 2018 um 14:46 Uhr #5012
Achso! Sorry.
Im Idealfall sollen die Daten so angezeigt werden wie im Datagrid.
D.H. als Liste und mit farblicher Trennung (weiß der Zeilen.Angezeigt werden sollte nur die Artikelnummer & die Bezeichnungen 1-4 (5 Spalten gesamt).
Das wäre klasse!
-
April 3, 2018 um 15:01 Uhr #5014
OK, schmückendes Beiwerk wie farbliche Trennung lassen wir erst einmal außen vor! 😎
Zuerst benötigen wir die oben genannten Infos aus dem Datagrid.
Das „Hilsfeld“ sollte wie gesagt ÜBERSICHTLICH sein, also scheiden hier vielleicht schon mal TABULATOREN darin aus, der User möchte nicht scrollen, sondern auf einen Blick alles Wichtige sehen und erkennen.Vielleicht zunächst die gewünschten Spalten einfach per KOMMA getrennt:
Artikelnummer, Bezeichnung1, Bezeichnung2, Bezeichnung3, Bezeichnung4Deine Aufgabe ist nun, eine Variable mit den Daten aus dem Datagrid in diesem Format zu füllen.
Aus dieser Variablen werden wir dann später die gewünschten Infos extrahieren, wenn der user etwas eingibt. Soweit klar?Also frisch ans Werk! 🙂
-
April 3, 2018 um 15:02 Uhr #5016
Kurze Frage, ist Dein Datagrid vom Typ TABLE?
-
April 3, 2018 um 15:09 Uhr #5018
Ja, mein Datagrid ist vom Typ Table.
Vielen Dank für deine Hilfe.
Ich werde berichten was ich fabriziert habe! :o) -
April 3, 2018 um 15:17 Uhr #5020
OK, kleiner Tip, alles, was wir mehr als einmal ausführen möchten/sollen/müssen, in einem separaten Handler auf der Karte oder im Stack auslagern.
Also nicht:
on mouseup do this do that get this get that put this put that etc... end mouseup
Sondern so, weil wir das ja nicht unbedingt noch einmal skripten wollen:
on mouseup mein_toller_handler end mouseup
Und dann im Kraten- oder Stackskript:
command mein_toller_handler do this do that get this get that put this put that etc... end mein_toller_handler
Somit können wir den Handler bei Bedarf von mehreren Stellen aufrufen, ohne ihn jedes Mal neu schreiben zu müssen. Dan nennt man Modularität! 🙂
Also versuche bitte, für die oben genannte Aufgabe eine Funktion zu erstellen, die die Daten aus dem Datagrid holt und eine Variable im oben genannten Format zurückliefert. Capisce?
-
April 3, 2018 um 16:15 Uhr #5026
Hallo Klaus,
Leider nix Capisce.
Durch mein ganzes rumprobieren bin ich noch mehr verwirrt als vorher.Mit folgendem Code importiere ich die Artikel:
on mouseUp answer file "Bitte eine CSV-Datei zum Import auswählen" with type "comma Separated Values|csv|CSV" if the result = "cancel" then exit mouseup end if put it into tFileName ## Inhalt der Datei in Variable lesen put URL ("file:" & tFileName) into tFileContents ## Datagrids benötigen TAB getrennte Werte: replace ";" with tab in tFileContents ## Nun einfach die Property "dgtext" des Datagrid auf diese Variable setzen set the dgText of group "artikel" to tFileContents end mouseUp Das funktioniert! Im Stack Script habe ich jetzt geschrieben:
command artikel_handler
put the dgtext of grp „artikel“ into art
put the dgData of grp „artikel“ into artikel_array
##artikel_array[1][„Teil“]
##artikel_array[1][„Bezeichnung“]
##artikel_array[1][„Bezeichnung 2“]
##artikel_array[1][„Bezeichnung 3“]
##artikel_array[1][„Bezeichnung 4“]
##artikel_array[1][„Mengeneinheit“]
##artikel_array[1][„Bruttopreis“]end artikel_handler
Was muss ich bei den auskommentieren Arrays genau hineinschreiben?
Wenn ich es wie oben mache, bekomme ich eine Fehlermeldung.Mir würde es total helfen wenn du mir sagen könntest, was man wie und wohin genau
für Code schreiben soll.(Schritt für Schritt)
Ich möchte das gerne mal zu 100% nachvollziehen können.
Will euch aber auch nicht zu viel Arbeit machen ;o)DANKE
-
April 3, 2018 um 16:30 Uhr #5028
Immer wichtig: Wie lautet die Fehlermeldung, die Du bekommst?
Wahrsxheinlich so etwas wie „No such object…“Daher musst Du im Skript angeben, wo genau das Datagrid liegt, also wie auf einem Brief die vollständige Adresse angeben:
command artikel_handler put the dgtext of grp "artikel" OF CARD "wo auch immer das Datagrid liegt" into art put the dgData of grp "artikel" OF CARD "wo auch immer das Datagrid liegt" into artikel_array ...
-
April 3, 2018 um 16:33 Uhr #5030
Hier die Fehlermeldung bei
command artikel_handler
put the dgtext of grp „artikel“ into art
put the dgData of grp „artikel“ into artikel_array
artikel_array[1][„Teil“]stack „Angebot“: compilation error at line 6 (Expression: bad factor) near „[„, char 4
-
April 3, 2018 um 16:34 Uhr #5032
Ach so, ja nun, du musst auch eine ANWEISUNG schreiben, also z.B.
…
PUT artikel_array[1][„Teil“] into whatever
…Du musst Dich aber auch entscheiden, woraus Du die benötigten Daten extrahierst, entweder aus
the dgtext of grp xxx
oder
the dgdata of grp xxx -
April 3, 2018 um 16:50 Uhr #5034
uppsss.
PUT artikel_array[1][„Teil“] into whatever
Kommen diese jetzt alle in die gleiche Variable?
Wie trenne ich diese dann wieder.Ich muss das nur einmal verstehen….
-
April 3, 2018 um 17:27 Uhr #5036
PUT artikel_array[1][„Teil“] into whatever
Ja nun, wie auf einem Blatt Papier, wo nur ein Wort draufsteht, können wir doch auch etwas VOR oder HINTER dieses Wort schreiben, oder nicht?
Das Selbe geht natürlich auch in LC:
... PUT artikel_array[1]["Teil"] into whatever put "Dies ist der Anfang der Variable whatever" & TAB BEFORE whatever put TAB & "und das das Ende der Variable..." AFTER whatever ...
Aber so werden wir das nicht machen, das war nur ein Beispiel, um Deinen ERROR zu erklären!
Ich fürchte, Du denkst schon zu kompliziert am Anfang.
Bitte versuche Dir das Problem selber zu erklären und zwar, wie Du es mit einem Blatt Papier machen würdest, wenn Du nur ein weiteres Blatt hast, auf dem der Inhalt des Array aufgezeichnet ist.Wie würdest Du manuell die benötigeten Infos auf besagtem Balatt auf das leere Blatt Papier bkommen? Was müssen wir dazu wissen?
Ich weiß, ich gehe Dir mit all den Fragen auf den Sack, aber das ist alles essentiell, niemand hat gesagt, daß Programmierung einfach ist.
Ausserdem hast du Dir als Anfangproblem ein ziemlich komplexes Thema vorgenommen, aber da musst Du nun durch. Das geht aber nur mit kleinen Schritten, die Du auch alle verstehen musst.
-
April 3, 2018 um 18:11 Uhr #5038
Nein. Das ist sogar sehr gut das du mir diese Fragen stellst.
Nur so lernt man doch.Ich brauche die Arraybezeichnung wie „Teil“ „Bezeichnung“ etc. richtig?
Diese Daten sind doch im artikel_array gespeichert.put artikel_array[1]["Teil"] into teil put artikel_array[1]["Bezeichnung"] into bez put artikel_array[1]["Bezeichnung 2"] into bez2 put artikel_array[1]["Bezeichnung 3"] into bez3 put artikel_array[1]["Bezeichnung 4"] into bez4 put artikel_array[1]["Mengeneinheit"] into menge put artikel_array[1]["Bruttopreis"] into preis
Ich stehe auf dem Schlauch. Arrays kann man doch zusammenfassen?
Ich habe jetzt wieder alles je in eine variable geschrieben.Das ist mir noch nicht schlüssig. Wo ist mein Denkfehler?
-
April 3, 2018 um 18:37 Uhr #5040
ha. nun zeigt das List field zumindest schonmal die 1 Zeile an!!!
command artikel_handler put the dgtext of grp "artikel" of card "import" into art put the dgData of grp "artikel" of card "import" into artikel_array put artikel_array[1]["Teil"] into teil put artikel_array[1]["Bezeichnung"] into bez put artikel_array[1]["Bezeichnung 2"] into bez2 put artikel_array[1]["Bezeichnung 3"] into bez3 put artikel_array[1]["Bezeichnung 4"] into bez4 put artikel_array[1]["Mengeneinheit"] into menge put artikel_array[1]["Bruttopreis"] into preis put teil, bez, bez2, bez3, bez4, menge, preis into anzeige replace "," with space in anzeige put anzeige into fld "list" end artikel_handler
Wie bekomme ich nun die anderen als Auswahlmöglichkeit angezeigt?
Danke
-
April 3, 2018 um 18:53 Uhr #5042
Hm, sieht so aus, als müssten wir hier bei 0 anfangen, dafür ist dieses Forum eigenltich nicht gedacht.
Normalerweise macht man so etwas mit nämlich einem REPEAT LOOP über alle Keys des Arrays.
Aber ich sehe, daß Du nun DOCH den gesamten Inhalt des Datagrids anzeigen möchtest und nicht, wie oben erwähnt, nur eine Teilmenge davon (Artikelnummer, Bezeichnung 1, Bezeichnung 2, Bezeichnung 3, Bezeichnung 4).
OK, in dem Fall machst du eigentlich nur Folgendes:
... ## TAB und CR getrennten TEXT (im Gegensatz zum ARRAY) aus dem Datagrid holen: put the dgtext of grp "artikel" of card "import" into alle_artikel replace TAB with "," in alle_artikel ## Oder mit SPACE ersetzen, wie in Deinem Handler, Du entscheidest! put alle_artikel into fld "list" ## Fertig. ...
Aber wir benötigen das als FUNKTION nicht als Handler, also was eine Variable mit den gewünschten Infos zurück liefert! Kriegst Du das hin?
Damit wir später einfach das hier benutzen können:
…
put alle_artikel_aus_dem_datagrid() into fld „list“
…
Dein handler füllt direkt alles in das Feld „list“, kann aber sein, daß wir diese Daten auch mal nur als Variable benötigen oder in ein anderes Feld schreiben möchten!Was Du oben geschrieben hast, ist aber nur ein kleiner Aspekt der Aufgabe, die ich Dir gestellt habe (die in BOLD!)
Gruß
Klaus
-
April 3, 2018 um 19:17 Uhr #5044
In der List sollen nur die Artikelnr & Bezeichnungen angezeigt werden,
die mit der Eingabe im Textfeld (identisch sind).
Also User schreibt z.B. 1170… in das Textfeld und das list field gibt alle im Datagrid möglichen Artikel die mit 1170 beginnen als Auswahl an.So wollte ich das darstellen.
Ich werde das mal versuchen hinzubekommen.
Sicherlich kommt noch die ein oder andere Frage :o)Danke dir für deine Mühe und Geduld mit mir.
Gruß
Andreas
-
April 3, 2018 um 19:34 Uhr #5046
Wie gesagt, mir ist schon klar, was Du genau machen willst.
OK, hier mal eine funktionierende Funktion, die Dir genau diese infos aus dem Datagrid herauszieht.
Das sollte im Stackscript liegen:function artikel_aus_datagrid ## Wir arbeiten mit dem ARRAY: put the dgData of grp "artikel" of card "import" into artikel_array ## Wir müssen wissen, wieviele "Datensätze" das Datagrid beinhaltet. ## Dafür fragen wir die Anzahl der KEYS des Array ab: put the keys of artikel_array int tKeys put the num of lines of tKeys into tAnzahl ## Nun gehen wir durch jeden einzelnen Datansatz des Datagrids und erstellen eine ## neue Variable mit den benötigten Infos: Artikelnummer, Bezeichnung1..., Bezeichnung4 ## Diese liefern wir dann in dieser Funktion zurück put empty into ReturnWert ## Nun "loopen" wir durch alle Datensätze repeat with i = 1 to tAnzahl ## In jedem Durchlauf wird i durch die laufende Nummer ersetzt! put artikel_array[i]["Teil"] after ReturnWert ## wir "kleben" die einzelnen Daten mit einem KOMMA aneinander: put "," & artikel_array[i]["Bezeichnung"] after ReturnWert put "," & artikel_array[i]["Bezeichnung 2"] after ReturnWert put "," & artikel_array[i]["Bezeichnung 3"] after ReturnWert ## Hier müssen wir am Ende eine neue Zeile einfügen, daher das CR put "," & artikel_array[i]["Bezeichnung 4"] & CR after ReturnWert end repeat ## So nun haben wir am Ende der Variablen ReturnWert aber eine leere Zeile, das letzte CR, ## die wir nun weglöschen: delete char -1 of ReturnWert ## Fertig, nun können wir die neuen Daten zurückliefern: return ReturnWert end artikel_aus_datagrid
Nun können wir, wann immer nötig:
…
put artikel_aus_datagrid() into fld „was auch immer“
…
Deine Aufgabe ist nun, diese Funktion zu verstehen und nachzuempfinden, was, wie und warum ich es so gemacht haben! Denn das hier ist leider der einfachste Teil deines Problems. 🙂Morgen geht es dann weiter…
Gruß
Klaus
-
April 4, 2018 um 09:00 Uhr #5049
Hallo Klaus,
wunderbar. Danke. Funktioniert bis dato.
Ich denke das ich die Funktion jetzt verstehe und mir der Zusammenhang nun langsam klar wird.
Jetzt müsste ja eigentlich „nur“ noch das Textfeld eine Validierung mit der Eingabe des User und des list fields bekommen.
Gruß
Andreas
-
April 4, 2018 um 11:37 Uhr #5051
Hallo Andreas,
Hinweis: Auf Grund langjähriger Tätigkeit als Musiker und Softwareentwickler bin ich ein nachtaktives Wesen geworden! 🙂
OK, weiter gehts…
In meinem Beispiel hier verwende ich den Namen „Eingabe“ für das Feld, in dem der User Artikelnummer oder Bezeichnung eingibt und den Namen „list“, den Du bereits verwendet hast, für das „Hilfsfeld“, das unter dem Eingabefeld auftauchen soll.
Das Feld „list“ ist zunächst einmal nicht sichtbar, wir lassen es auftauchen, wenn der User seine Eingabe macht.
Um effektiv, und somit schnell, zu arbeiten, werden wir meine Funktion nur EINMAL nutzen und den Rückgabewert irgendwo zwischenspeichern.
Das machen wir aber nicht in einer lokalen oder globalen Variablen, sondern in einer Custom Property des Feldes „list“.
Eine Property ist ja sowas wie height, width etc. eines LC Objektes, das sind die „eingebauten“ Properties.
„Custom Properties“ sind nun Properties, die nicht eingebaut sind und die wir selber definieren.
Stell Dir das ungefähr so vor wie eine Variable, die aber weder lokal noch global ist, sondern an ein LC Objekt „angetackert“ ist.
Das hat den Vorteil, daß sie mit dem Stack gespeichert wird, wenn wir den Stack speichern sollten. Das hat in unserem Fall keine Bedeutung, ist aber unbedingt wissenswert!
Jedes LC Objekt kann eine oder auch mehrere CPs enthalten, ja sogar Custom Property Sets, was sowas wie ein Array ist, aber das nur am Rande…
Wir können Custom Properties benennen, wie wir auch Variablen benennen würden, also immer EIN Wort.
Ich verwende immer ein kleines C am Anfang des Namens, um schon aus der Ferne zu sehen, daß es eine CP ist und keine Variable.
Setzen und Abfragen von CPs:
…
set the cLieblingsFarbe of stack „mein Stack“ to „blau“
## MitWerten füllen IMMER mit SET, put funktioniert hier nicht!
…
answer the cLieblingsFarbe of stack „mein Stack“
## -> blau
…OK, kommen wir nun zum Skript vom Feld „Eingabe“:
on openfield ## User hat in das Feld geklickt, nun geht es los: ## Zunächst speichern wir die benötigten Infos aus dem Datagrid in einer CP des Feldes "list", ## um später schneller darauf zugreifen zu können set the cTempDaten of fld "list" to artikel_aus_datagrid() ## Aufräumen (Feld leeren) ist auch eine gute Idee, aber optional: put empty into me end openfield ## Nun müssen wir die Eingabe(n) des user prüfen und im Feld "list" alle Zeilen anzeigen ## die den eingegebenen String (= Zeichenkette = ein oder mehrere Buchstaben) enthalten. ## Das machen wir mit FILTER und Platzhaltern (wildcards), die KEINE oder einen oder mehrere ## unbekannte Buchstaben repräsentieren. Dazu nutzen wir den Asterisk, also das Zeichen über ## dem PLUS-Zeichen auf der Tastatur: * ## Beispiel mit einer mehrzeiligen Variable namens el_testo: ## filter el_testo with "eins*" ## zeigt uns alle Zeilen an, sofern vorhanden, die mit eins ANFANGEN, egal ob dahinter ## noch was kommt oder nicht ## filter el_testo with "*eins" ## zeigt uns alle Zeilen an, sofern vorhanden, die mit eins ENDEN, egal ob davor noch... ## filter el_testo with "*eins*" ## zeigt uns alle Zeilen an, sofern vorhanden, die mit eins ANFANGEN, den String ## IRGENDWO in der Zeile ENTHALTEN oder mit eins ENDEN. ## Und das machen wir nachdem der User etwas eingegeben hat, also -> on keyup der_eingebene_buchstabe ## Den Parameter benötigen wir hier aber nciht. on keyup tKey ## Den gesamten bereits eingegebenen Text des Felds abgreifen: put me into SuchString ## Nun die gespeicherte CP in eine Variable packen und darin FILTERn put the cTempDaten of fld "list" into AlleDaten ## Text des Feldes mit WILDCARD vorne und hinten filter AlleDaten with ("*" & SuchString & "*") ## Prüfen, ob es passende Daten gibt, wenn nicht, BEEPen oder so, ## damit der user das auch mitbekommt. if AlleDaten = EMPTY then ## Nichts gefunden beep ## Nun den Handler verlassen exit keyup end if ## Wir haben also etwas gefunden, nun dem User auch anzeigen put AlleDaten into fld "list" ## Feld könnte noch versteckt sein: if the visible of fld "list" = FALSE then show fld "list" end if end keyup
Nun das Skript für das LIST-Feld „list“
on mousedoubleup ## Den angeklickten/ausgewählten Text ins Feld "Eingabe" oder wohin auch immer schreiben put the selectedtext of me into fld "Eingabe" ## Fertig, nun Tschüss, mein Listenfeld: hide me end mousedoubleup
Fertig, bitte mal ausprobieren und verstehen, bei Bedarf wieder nachfragen.
Und bitte immer alle unbekannten Begriffe im DICTIONARY nachschlagen!Gruß
Klaus
-
April 4, 2018 um 12:20 Uhr #5053
Hallo Klaus,
Musiker und Softwareentwickler. Sehr interessante Kombi. Da wird man sehr wahrscheinlich Nachtaktiv :o). Bei mir als „Sesselpupser“ ist das leider nicht so.
Ich habe die Daten mal eingespielt…..und was soll ich sagen. KLAPPT natürlich.
Ich werde das heute Abend mal Schritt für Schritt nachvollziehen um es zu verstehen.
Die weiteren Schritte wie Export und Druckfunktion werde ich hoffentlich ohne Hilfe hinbekommen.Ich weiß gar nicht wie oft ich jetzt DANKE sagen muss.
ALSO VIELEN DANK FÜR DEINE HILFE.
Gruß
Andreas
-
April 4, 2018 um 12:30 Uhr #5055
Hi Andreas,
schön, daß es klappt, ich habe das nämlich nicht ausprobiert, sondern aus dem Kopf niedergeschrieben. 🙂
Wenn du magst, kannst Du Dir ja mal meine Website ansehen: http://www.major-k.de
Oben geht es zur Softwareentwicklung, unten zur Basspage.Gruß
Klaus
-
April 4, 2018 um 16:01 Uhr #5057
Hallo Klaus,
aus dem Kopf niedergeschrieben? Respekt!!!
Eine kleine Frage hätte ich doch noch.
Ich übernehme ja aus der List die (Artikelnummer, Bezeichnung 1-4).Wie kann ich mir den passenden Preis und die Mengeneinheit in separate Textfelder (hinter Eingabefeld) ausgeben lassen. Diese Daten stehen auch im Datagrid, sollen aber bei der Listauswahl wegen der Übersichtlichkeit nicht mit angezeigt werden.
Vielleicht schwirrt dir das ja auch einfach so im Kopf rum :o)
DANKE VORAB
Deine Seite schaue ich mir auf jeden Fall mal an.
Gruß
Andreas
-
April 4, 2018 um 18:08 Uhr #5059
Alter, Du bist unersättlich! 😀
OK, ersetze den „mousedoubleup“ Handler von Feld „list“ mit diesem hier:
on mousedoubleup ## Den angeklickten/ausgewählten Text ins Feld "Eingabe" oder wohin auch immer schreiben put the selectedtext of me tSelectedText put tSelectedText into fld "Eingabe" hide me ## Hier für muss das Feld nicht sichtbar sein. ## wir werden diese Zeile aus dem DGTEXT des Datagrids extrahieren, dafür mussen wir: replace "," with TAB in tSelectedText ## Du weisst warum, oder? put the dgData of grp "artikel" of card "import" into artikel_text ## Nun arbeiten wir mit LINEOFFSET, in welcher Zeile steht der gesamte Artikel: put lineoffset(tSelectedText,artikel_text) into tZeile ## Nun diese Zeile extrahieren put line tZeile of artikel_text into tArtikel ## Nun die entsprechenden Spalten herausziehen set itemdel to TAB ## Bitte überprüfen, aber das müssten die gesuchten ITEMS in der Zeile sein ## Und natürlich XXX und YYY mit den Namen Deiner entsprechenden Felder ersetzen! ## Mengeneinheit put item 6 of tArtikel into fld "xxx" ## Bruttopreis put item 7 of tArtikel into fld "yyy" ## Ein wenig aufräumen, damit diese Daten nicht mit gespeichert werden: set the cTempDaten of me to empty end mousedoubleup
Gruß
Klaus
-
April 5, 2018 um 12:06 Uhr #5064
Hallo KLaus,
klar. Ich muss das jetzt durchziehen :o)
Eine letzte kleine Frage noch:
Ich bekomme im Code kein Fehler angezeigt, aber er gibt mir die Items nicht aus.
Der Rest klappt.DANKE
-
April 5, 2018 um 12:12 Uhr #5066
Pardon, mein Fehler!
Diese Zeile:
…
put the dgData of grp „artikel“ of card „import“ into artikel_text
…
Bitte ersetzen durch:
…
put the DGTEXT of grp „artikel“ of card „import“ into artikel_text
…
Dann sollte es klappen. -
April 5, 2018 um 12:20 Uhr #5068
Nein. Sorry von mir.
Das hatte ich schon geändert.Ich sehe aber gerade das er nicht bei allen Artikeln die Menge & Preis anzeigt.
Im Datagrid sind diese vorhanden. Er scheint es überall da nicht anzuzeigen wo in den
Artikelbezeichnungen ein Komma vorkommt. -
April 5, 2018 um 12:36 Uhr #5070
Ach ja, DAS (Kommata in bezeichnungen oder sonstwo) ist natürlich ein Problem.
Dann machen wir Folgendes, anstatt den TAB durch Komma zu ersetzen, nehmen wir die PIPE |
Auf dem Mac ALT-7, Windows keine Ahnung…In der Funktion artikel_aus_datagrid:
... repeat with i = 1 to tAnzahl ## In jedem Durchlauf wird i durch die laufende Nummer ersetzt! put artikel_array[i]["Teil"] after ReturnWert ## wir "kleben" die einzelnen Daten mit einem KOMMA aneinander: put "," & artikel_array[i]["Bezeichnung"] after ReturnWert put "," & artikel_array[i]["Bezeichnung 2"] after ReturnWert put "," & artikel_array[i]["Bezeichnung 3"] after ReturnWert ## Hier müssen wir am Ende eine neue Zeile einfügen, daher das CR put "," & artikel_array[i]["Bezeichnung 4"] & CR after ReturnWert end repeat ...
Überall das Komma ersetzen mit |:
... put "|" & artikel_array[i]... ...
Dann im MOUSEDOUBLEUP Hanlder vom Feld „list“ ebenso:
on mousedoubleup ## Den angeklickten/ausgewählten Text ins Feld "Eingabe" oder wohin auch immer schreiben put the selectedtext of me tSelectedText put tSelectedText into fld "Eingabe" hide me ## Hier für muss das Feld nicht sichtbar sein. ## wir werden diese Zeile aus dem DGTEXT des Datagrids extrahieren, dafür mussen wir: replace "|" with TAB in tSelectedText ...
Du kannst natürlich auch einen anderen Buchstaben als Trenner (# o.ä.) benutzen, dann musst Du die Skripts halt ensprechend ändern.
Gruß
Klaus
-
April 5, 2018 um 12:43 Uhr #5072
PERFECTO !!!!
DANKE VIELMALS
GRUß
ANDREAS
-
April 5, 2018 um 13:01 Uhr #5074
Bitte schön, gern geschehen, Rechnung kommt Ende des Monats! 😀
-
April 5, 2018 um 13:04 Uhr #5076
Wenn ich den Verlauf so sehe wird das ziemlich teuer :O(
-
April 5, 2018 um 13:17 Uhr #5078
Ich gebe Dir 2% Skonto bei Barzahlung! 😀
-
April 5, 2018 um 15:37 Uhr #5080
:o)
und schon das nächste Hindernis.
Wie kann ich mit den Item`s eine Berechnung anstellen?
Item 7 (Bruttopreis) wird doch in der Variablen tpreis gespeichert.
Ich bekomme jedoch eine Fehlermeldung.Hier der Code:
put item 7 of tArtikel into tpreis put tpreis & " €" into fld "preis" put fld "menge" into wert1 put fld "preis" into wert2 put wert1 * wert2 into ergebnis put ergebnis into fld "gesamtpreis"
Hier die Fehlermeldung:
field „list“: execution error at line 74 (Operators *: error in right operand), char 1
Woran liegt das? Am dgTEXT ?
DANKE
Andreas
-
April 5, 2018 um 15:48 Uhr #5082
Zunächst einmal bitte generell im Deutschen auf das Apostroph im Plural verzichten:
Ein ITEM, zwei ITEMS 😎Die Fehlermeldung besagt, daß der Inhalt eins dieser Felder offensichtlich KEINE Zahl ist!
Bitt mal nachsehen, ob sich vielleicht ein CR oder TAB oder sonstws da eingschlichen hat.Ah, oder da ist ein KOMMA drin: 1,50!
LC ist englisch und kennt daher nur den PUNKT als Dezimaltrenner: 1.50Ich habe mir für solche Situationen zwei kleine Funktionen geschreiben:
function ohne_komma tZahl replace "," with "." in tZahl return tZahl end ohne_komma function mit_komma tZahl replace "." with "," in tZahl return tZahl end mit_komma
Lege die ins Stackskript und nutze die eine für berechnungen, die andere für das Anzeigen.
... put item 7 of tArtikel into tpreis put tpreis & " €" into fld "preis" ## Zur Berechnung put fld "menge" into wert1 put fld "preis" into wert2 put ohne_komma(wert1) * ohne_komma(wert2) into ergebnis put mit_komma(ergebnis) into fld "gesamtpreis" ...
Aber ich sehe, mit dem EURO Zeichen kann LC natürlich nciht rechnen, Punkt hin oder Komma her!
Ändere die Reihenfolge in dem Skript, dann klappt das auch!
Also entweder:... put item 7 of tArtikel into tpreis put tpreis & " €" into fld "preis" ## Zur Berechnung put fld "menge" into wert1 ## diesen Wert OHNE Eurozeichen haben wir bereits in der Variablen tpreis ## also nimm das zur Berechnung ## put fld "preis" into wert2 put ohne_komma(wert1) * ohne_komma(tpreis) into ergebnis put mit_komma(ergebnis) into fld "gesamtpreis" ...
Oder
... put item 7 of tArtikel into tpreis ## Zur Berechnung put fld "menge" into wert1 ## diesen Wert OHNE Eurozeichen haben wir bereits in der Variablen tpreis ## also nimm das zur Berechnung ## put fld "preis" into wert2 put ohne_komma(wert1) * ohne_komma(tpreis) into ergebnis put mit_komma(ergebnis) into fld "gesamtpreis" ## Jetzt erst das EURO Zeichen hinzufügen: put tpreis & " €" into fld "preis" ...
Gruß
Klaus
-
April 5, 2018 um 16:08 Uhr #5084
Übrigens, der Fehler mit der falschen Reihenfolge der Befehle oben kostet extra! 😀
-
April 5, 2018 um 16:12 Uhr #5086
Der Geldtransporter ist schon unterwegs :o)
Dafür könntest du mir noch eine Frage beantworten.
Wie passe ich die Berechnung an, wenn das Text Field „Menge“ durch den User geändert wird?Irgendwann habe ich auch dein LC-Wissen. Das motiviert mich jetzt :o)
-
April 5, 2018 um 16:46 Uhr #5088
Du könntest ein „on closefield“ Handler an das Feld „Menge“ kleben, was die Berechnung erneut durchführt.
Bin jetzt weg zur Probe für den Rockgig am Samstag! 🙂
-
April 5, 2018 um 16:47 Uhr #5090
Danke.
Viel Spass beim „Rocken“
-
April 6, 2018 um 07:50 Uhr #5099
Hallo Klaus,
hoffe die Probe war erfolgreich ?
Den „on closefield“ Handler habe ich hinbekommen!
Ich versuche mich aber seit gestern an dem format ,00 €.
Irgendwie klappt es nicht so wirklich.Im field gesamtpreis schneidet er mir die zweite null weg.
z.b 20,99 zeigt er an. Bei 20,90 nur 20,9. -
April 6, 2018 um 09:05 Uhr #5101
Hi Andreas,
Proben mit mir sind IMMER erfolgreich! 😀
Heute abend mal wieder eine Session hier in Osanbrück und morgen dann der Gig, love it!OK, Du kannst das erzwingen, in dem Du „the numberformat“ setzt, etwa so:
... set the numberformat to "0.00" # 2 Dezimalstellen put ohne_komma(wert1) * ohne_komma(tpreis) into ergebnis put mit_komma(ergebnis) into fld "gesamtpreis" ...
Et voila, Feld „gesamtpreis“ sollte nun zwei Dezimalstellen hinter dem Komma anzeigen.
Das funktioniert aber NUR mit den Resultaten einer Rechenoperation, kann man aber zur Not erwzingen, indem man 0 addiert. Beispiel:... put 200.0 into derPreis set the numberformat to "0.00" ## derPreis ist immer noch 200.0 add 0 to derPreis answer derPreis ## -> 200.00 ...
Gruß
Klaus
-
April 6, 2018 um 09:21 Uhr #5105
:o)
Spielst du in einer eigenen Band? Wo ist den dein GIG?
Leider klappt das nicht mit der Anzeige. Hier mein Code:
put item 7 of tArtikel into tpreis ##put tpreis & " €" into fld "preis" put tpreis into fld "preis" ## Zur Berechnung put fld "menge" into wert1 ## diesen Wert OHNE Eurozeichen haben wir bereits in der Variablen tpreis ## also nimm das zur Berechnung put fld "preis" into wert2 set the numberformat to "0.00" # 2 Dezimalstellen put ohne_komma(wert1) * ohne_komma(wert2) into ergebnis put mit_komma(ergebnis) into fld "gesamtpreis"
-
April 6, 2018 um 09:39 Uhr #5109
Gute, Frage, kann ich im Moment leider nicht beantworten.
Offensichtlich kommt LC irgendwie nicht mit meinen „ohne/mitkomme Funktionen zurecht.habe das hier ausprobiert:
on mouseUp pMouseButton put 10 into menge put "2,3" into preis set the numberformat to 0.00 # 2 Dezimalstellen put ohne_komma(menge) into menge put ohne_komma(preis) into preis put menge * preis into ergebnis answer ergebnis answer mit_komma(ergebnis) end mouseUp
Ich habe zunächst einmal die Angabe für numberformat mit 0.00 ersetzt, dann bekam ich Folgendes:
answer ergebnis -> 23.00
answer mit_komma(ergebnis) -> 23
???
Muss ich drüber nachdenken, sorry…Nein, im Moment habe ich keine eigene Band, ich helfe in einer Coverband aus und wir spielen morgen hier, leider nur ein FACEBOOK Link:
https://www.facebook.com/events/179765879286157/
Hofstelle Duling, Drosselweg 2, 49134 WallenhorstGruß
Klaus
-
April 6, 2018 um 10:07 Uhr #5113
Rock for Children ! Dann muss es gut werden!
Schade. Habe auch jetzt schon einiges propiert.
Leider auch noch keine Lösung. -
April 6, 2018 um 10:10 Uhr #5115
Ich werde mal auf der LC Mailingliste nachfragen…
-
April 6, 2018 um 10:49 Uhr #5121
OK, da ich beim Programmieren nich nue Zeit und Gedulg aufgewendet habe, um herauszufinden, warum etwas ncuht funktionert, wenn es doch einen Workaround gibt, hab ich mich and die Funktion format() in LC erinnert.
Die macht genau das, was wir benötigen, nämlich X Nachkommestellen DAUERHAFT zu erzwingen!
Ich habe die Vermutung „numberformat“ ist eine irgendwie „flüchtige/rtemporäre“ Angelegenheit.Da diese funktion aus der Sprache C kommt, ist ihre Syntax leider uach etwas kryptisch.
Hier mnein obiges Beispielskript nun mit FORMAT():on mouseUp pMouseButton put 10 into menge put "2,3" into preis #set the numberformat to 0.00 # 2 Dezimalstellen put ohne_komma(menge) into menge put ohne_komma(preis) into preis put menge * preis into ergebnis put format("%1.2f",ergebnis) into ergebnis answer mit_komma(ergebnis) end mouseUp
Das f bedeutet, wir möchten eine FLOATING Number (also eine Zahl mit Nachkommastellen haben)
Und die 2 davor, daß wir genau ZWEI Nachkommastellen haben möchten.Du kannst das auch schachteln, aber das ist nicht besonders leserlich 😀
…
put ohne_komma(menge) into menge
put ohne_komma(preis) into preis
put mit_komma(format(„%1.2f“,menge * preis)) into fld „ergebnis“
…Gruß
Klaus
-
April 6, 2018 um 11:17 Uhr #5123
SUPI. Das klappt sehr gut.
So. Wenn ich jetzt noch den Tausender Separator 1.000,00 € eingefügt bekomme kann ich beruhigt ins Wochenende starten.
-
April 6, 2018 um 11:20 Uhr #5125
Das musst Du leider manuell machen, indem Du die Anzahl der Zeichen zählst und an ensprechender Stelle den Punkt setzt. Dafür gibt es keine Funktion o.ä. in LC.
-
April 6, 2018 um 12:24 Uhr #5127
Zur Info:
Ich habe auf der Mailingliste vom Chefentwickler von LC, Mr. Mark Waddingham, eine Antwort mit verständlicher Erklärung bekommen, die ich mal unübersetzt hier rein stelle:
############################################################################
The numberFormat is a local property and is only used when a number gets converted to a string…put menge * preis into ergebnis — ergebnis is a number
answer ergebnis — ergebnis is converted to a string using the numberFormat 0.00 and passed to ‚answer‘.In the last line ‚answer mit_komma(ergebnis)‘ you are passing ergebnis (a number) to a function. In the function, that number is converted to a string using the default numberFormat (as it is local to handlers, and you have not set it) as you are using ‚replace‘ on it.
So, the ‚issue‘ here is the locality of numberFormat.
############################################################################
Klingt komisch, ist aber so. 🙂 -
April 6, 2018 um 14:40 Uhr #5129
Danke für diese Info :o)
Gestatte mir bitte noch zwei Fragen:
Wie schreibe ich die Zähl-Schleife richtig, dass der Punkt korrekt gesetzt wird?
Ich habe schon einiges probiert. Das hat er mir den Tausender Punkt gesetzt aber
leider nicht aufgehört weitere Puntke zu setzen. Und Bang hat sich LC aufgehängt.2te Frage: Ich gebe ja die Artikel, Preise in Feldern aus.
Hier werden ja auch noch einige Felder hinzukommen.
Ist es in LC möglich die Texte in jedem Feld (das Angebot an sich) zu exportieren und bei Bedarf
wieder genau so einzulesen, falls der User an seinem Angebot nachträglich was ändern möchte?DANKE DANKE DANKE DANKE DANKE DANKE
-
April 6, 2018 um 15:03 Uhr #5131
Nicht vor Sonntag, bin jetzt weg…
Wichtig, in einem (hier offensichtlich) „endlosen“ repeat loop IMMER eine Bedingung reinpacken, die den Loop verlassen kann!
Du kannst auch versuchen mit CMD. (Punkt) die Unterbrechung zu erzwingen.
Dann kommt wohl eine Fehlermeldung, aber Du bist aus dem Loop raus! -
April 6, 2018 um 15:06 Uhr #5133
Hallo Klaus,
wie du es schaffst natürlich.
Ich wünsche dir viel Spaß bei deinem GIG.
Lass es ordentlich krachen.
Gruß
Andreas
-
April 8, 2018 um 10:49 Uhr #5147
Hallo Andreas,
ich denke, mit weit über 50 Postings in diesem Thread haben wir die Grenzen dieses Forum schon lange gesprengt. Ausser uns wird sich sicher niemand hier durchkämpfen.
Ausserdem hat es sich mittlerweile mehr zu einem persönlichen Coaching entwickelt, was ich eigentlich als Dienstleistung anbiete.
Und mit erfolg, siehe hier:
https://www.livecode-blog.de/forums/topic/meine-erste-app-ist-fertig/Vorschlag: Eröffne einen neuen Thread für das Tausendertrenner Problem.
Ich habe die Funktion schon fertig! 🙂Oder erwäge eventuell, falls Du im Berufsleben stehst und kein Student, Schüler oder arbeitslos bist, mich zu engagieren für Coaching per Skype und/oder Email.
Ich hoffe, Du empfindest das nicht als zu aufdringlich, aber ich bin seit über 6 Jahren arbeitslos, da kommt man schon mal auf solche Gedanken…
Bin aber natürlich nicht böse, wenn nicht, und werde selbstredend auch weiterhin hier Fragen beantworten, aber wie oben erwähnt, am Besten für jedes neue Problem einen neuen Thread aufmachen, dann haben alle was davon.
Gruß
Klaus
-
-
AutorBeiträge
- Du musst angemeldet sein, um auf dieses Thema antworten zu können.