Datagrid – auslesen

Startseite Foren Deutsches LiveCode-Forum Datagrid – auslesen

Schlagwörter: 

Ansicht von 53 Antwort-Themen
  • Autor
    Beiträge
    • #4989
      AnHa
      Teilnehmer

      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

    • #5006
      Klaus Major
      Verwalter

      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

    • #5008
      AnHa
      Teilnehmer

      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

    • #5010
      Klaus Major
      Verwalter

      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.

    • #5012
      AnHa
      Teilnehmer

      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!

    • #5014
      Klaus Major
      Verwalter

      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, Bezeichnung4

      Deine 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! 🙂

    • #5016
      Klaus Major
      Verwalter

      Kurze Frage, ist Dein Datagrid vom Typ TABLE?

    • #5018
      AnHa
      Teilnehmer

      Ja, mein Datagrid ist vom Typ Table.

      Vielen Dank für deine Hilfe.
      Ich werde berichten was ich fabriziert habe! :o)

    • #5020
      Klaus Major
      Verwalter

      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?

    • #5026
      AnHa
      Teilnehmer

      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

    • #5028
      Klaus Major
      Verwalter

      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
      ...
    • #5030
      AnHa
      Teilnehmer

      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

    • #5032
      Klaus Major
      Verwalter

      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

    • #5034
      AnHa
      Teilnehmer

      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….

    • #5036
      Klaus Major
      Verwalter

      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.

    • #5038
      AnHa
      Teilnehmer

      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?

    • #5040
      AnHa
      Teilnehmer

      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

    • #5042
      Klaus Major
      Verwalter

      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

    • #5044
      AnHa
      Teilnehmer

      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

    • #5046
      Klaus Major
      Verwalter

      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

    • #5049
      AnHa
      Teilnehmer

      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

    • #5051
      Klaus Major
      Verwalter

      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

    • #5053
      AnHa
      Teilnehmer

      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

    • #5055
      Klaus Major
      Verwalter

      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

    • #5057
      AnHa
      Teilnehmer

      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

    • #5059
      Klaus Major
      Verwalter

      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

    • #5064
      AnHa
      Teilnehmer

      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

    • #5066
      Klaus Major
      Verwalter

      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.

    • #5068
      AnHa
      Teilnehmer

      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.

    • #5070
      Klaus Major
      Verwalter

      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

    • #5072
      AnHa
      Teilnehmer

      PERFECTO !!!!

      DANKE VIELMALS

      GRUß

      ANDREAS

    • #5074
      Klaus Major
      Verwalter

      Bitte schön, gern geschehen, Rechnung kommt Ende des Monats! 😀

    • #5076
      AnHa
      Teilnehmer

      Wenn ich den Verlauf so sehe wird das ziemlich teuer :O(

    • #5078
      Klaus Major
      Verwalter

      Ich gebe Dir 2% Skonto bei Barzahlung! 😀

    • #5080
      AnHa
      Teilnehmer

      :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

    • #5082
      Klaus Major
      Verwalter

      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.50

      Ich 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

    • #5084
      Klaus Major
      Verwalter

      Übrigens, der Fehler mit der falschen Reihenfolge der Befehle oben kostet extra! 😀

    • #5086
      AnHa
      Teilnehmer

      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)

    • #5088
      Klaus Major
      Verwalter

      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! 🙂

    • #5090
      AnHa
      Teilnehmer

      Danke.

      Viel Spass beim „Rocken“

    • #5099
      AnHa
      Teilnehmer

      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.

    • #5101
      Klaus Major
      Verwalter

      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

    • #5105
      AnHa
      Teilnehmer

      :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"
         
    • #5109
      Klaus Major
      Verwalter

      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 Wallenhorst

      Gruß

      Klaus

    • #5113
      AnHa
      Teilnehmer

      Rock for Children ! Dann muss es gut werden!

      Schade. Habe auch jetzt schon einiges propiert.
      Leider auch noch keine Lösung.

    • #5115
      Klaus Major
      Verwalter

      Ich werde mal auf der LC Mailingliste nachfragen…

    • #5121
      Klaus Major
      Verwalter

      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

    • #5123
      AnHa
      Teilnehmer

      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.

    • #5125
      Klaus Major
      Verwalter

      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.

    • #5127
      Klaus Major
      Verwalter

      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. 🙂

    • #5129
      AnHa
      Teilnehmer

      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

    • #5131
      Klaus Major
      Verwalter

      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!

    • #5133
      AnHa
      Teilnehmer

      Hallo Klaus,

      wie du es schaffst natürlich.

      Ich wünsche dir viel Spaß bei deinem GIG.

      Lass es ordentlich krachen.

      Gruß

      Andreas

    • #5147
      Klaus Major
      Verwalter

      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

Ansicht von 53 Antwort-Themen
  • Du musst angemeldet sein, um auf dieses Thema antworten zu können.