Codeblöcke [ERLEDIGT]
Moderator: Moderatoren
- Manfred
- Foren-Administrator
- Beiträge: 21224
- Registriert: Di, 29. Nov 2005 16:58
- Wohnort: Kreis Wesel
- Hat sich bedankt: 210 Mal
- Danksagung erhalten: 67 Mal
Codeblöcke [ERLEDIGT]
Na gut, dann eröffne ich ein neues Thema (sammel ich also doch Punkte)
Die Sache mit den Codeblöcken ist folgende.....
Ich verstehe sie einfach nicht.
Kleine Dinge, wie diese hier-> aProt := ASORT(aProt,,, {|x,y| x[F_DATE] < y[F_DATE]}) sind ja nachvollziehbar.
Soweit ich aber gelesen habe, sollen die komplette Do WHILE Strukturen ersetzen.
Aus der Erklärungen die in der Hilfe sind, werde ich nicht schlau.
Gruß
Manfred
Die Sache mit den Codeblöcken ist folgende.....
Ich verstehe sie einfach nicht.
Kleine Dinge, wie diese hier-> aProt := ASORT(aProt,,, {|x,y| x[F_DATE] < y[F_DATE]}) sind ja nachvollziehbar.
Soweit ich aber gelesen habe, sollen die komplette Do WHILE Strukturen ersetzen.
Aus der Erklärungen die in der Hilfe sind, werde ich nicht schlau.
Gruß
Manfred
Zuletzt geändert von Manfred am Mo, 24. Nov 2008 13:59, insgesamt 2-mal geändert.
- Martin Altmann
- Foren-Administrator
- Beiträge: 16555
- Registriert: Fr, 23. Sep 2005 4:58
- Wohnort: Berlin
- Hat sich bedankt: 115 Mal
- Danksagung erhalten: 48 Mal
- Kontaktdaten:
Re: Codeblöcke
Hallo Manfred,
Du "loopst" über Dein komplettes Array und sortierst die Einträge nach der Spalte F_DATE aufsteigend.
Das ganze geht natürlich auch noch wesentlich verschachtelter, so dass die Codeblöcke erst richtig zur Geltung kommen:
Dies macht folgendes:
Das Array wird nach der ersten Spalte aufsteigend sortiert. Bei gleichen Einträgen in der ersten Spalte, werden diese nach der zweiten Spalte aufsteigend sortiert. Gibt es Einträge, die in der ersten und zweiten Spalte gleich sind, so werden sie nach der dritten Spalte aufsteigend sortiert.
Beispiel: Eine Liste mit Deinen Kunden. Das Array ptag enthält {Ort, PLZ, Kundenname, und_noch_beliebige_weitere_Spalten}
Deine Ausgabe nach dem o.g. Sort wäre also nach Orten sortiert, innerhalb der Orte nach Postleitzahlen und innerhalb gleicher Postleitzahlregionen nach Kundennamen.
Viele Grüße,
Martin
nun - genau das macht doch auch Dein Beispiel :?:Manfred hat geschrieben:Kleine Dinge, wie diese hier-> aProt := ASORT(aProt,,, {|x,y| x[F_DATE] < y[F_DATE]}) sind ja nachvollziehbar.
Soweit ich aber gelesen habe, sollen die komplette Do WHILE Strukturen ersetzen.
Du "loopst" über Dein komplettes Array und sortierst die Einträge nach der Spalte F_DATE aufsteigend.
Das ganze geht natürlich auch noch wesentlich verschachtelter, so dass die Codeblöcke erst richtig zur Geltung kommen:
Code: Alles auswählen
asort( ptag,,, {|aX,aY| iif( aX[ 1 ] <> aY[ 1 ], aX[1] < aY[1], iif( aX[ 2 ] <> aY[ 2 ], aX[2] < aY[2], aX[ 3 ] < aY[ 3 ] ) ) } )
Das Array wird nach der ersten Spalte aufsteigend sortiert. Bei gleichen Einträgen in der ersten Spalte, werden diese nach der zweiten Spalte aufsteigend sortiert. Gibt es Einträge, die in der ersten und zweiten Spalte gleich sind, so werden sie nach der dritten Spalte aufsteigend sortiert.
Beispiel: Eine Liste mit Deinen Kunden. Das Array ptag enthält {Ort, PLZ, Kundenname, und_noch_beliebige_weitere_Spalten}
Deine Ausgabe nach dem o.g. Sort wäre also nach Orten sortiert, innerhalb der Orte nach Postleitzahlen und innerhalb gleicher Postleitzahlregionen nach Kundennamen.
Viele Grüße,
Martin
- Manfred
- Foren-Administrator
- Beiträge: 21224
- Registriert: Di, 29. Nov 2005 16:58
- Wohnort: Kreis Wesel
- Hat sich bedankt: 210 Mal
- Danksagung erhalten: 67 Mal
Hi Martin,
na gut, dann mal anders herum:
Wenn ein fertiger Codeblock steht und das Ergebnis zu sehen ist, dann kann ich es einigermaßen nachvollziehen, warum, weshalb, weswegen.
Ich habe aber keinen Plan, mein evtl. Problem in einen Codeblock zu schreiben. Da liegt bei mir das Verständnisloch. Was wird warum wo reingeschrieben. Was kommt immer/jedesmal/in dem Fall zwischen ||, was kommt dahinter? Was macht ||? Warum macht es das ?
Mag jetzt irgendwie blöd klingen, aber ich habe irgendwie eine Mauer, vor die ich in dem Fall renne.
Gruß
Manfred
na gut, dann mal anders herum:
Wenn ein fertiger Codeblock steht und das Ergebnis zu sehen ist, dann kann ich es einigermaßen nachvollziehen, warum, weshalb, weswegen.
Ich habe aber keinen Plan, mein evtl. Problem in einen Codeblock zu schreiben. Da liegt bei mir das Verständnisloch. Was wird warum wo reingeschrieben. Was kommt immer/jedesmal/in dem Fall zwischen ||, was kommt dahinter? Was macht ||? Warum macht es das ?
Mag jetzt irgendwie blöd klingen, aber ich habe irgendwie eine Mauer, vor die ich in dem Fall renne.
Gruß
Manfred
- Martin Altmann
- Foren-Administrator
- Beiträge: 16555
- Registriert: Fr, 23. Sep 2005 4:58
- Wohnort: Berlin
- Hat sich bedankt: 115 Mal
- Danksagung erhalten: 48 Mal
- Kontaktdaten:
Hallo Manfred,
aah - OK.
Also: ein Codeblock ist immer nach dem Schema { |...| .... } aufgebaut.
Zwischen den beiden || stehen einfach die Variablen, die Du später (hinter den || ) in den Anweisungen verwenden willst.
In meinem Beispiel brauche ich zwei Variablen, die ich miteinander vergleichen will. Da ich ja ein Array verarbeite, steht jede Variable für jeweils ein Element des Arrays - einer kompletten Zeile bei mehrdimensionalen Arrays!
Hinter den beiden || steht die aufzurufende Funktion oder die abzuarbeitende Sequenz - sollen Funktionen bzw. Sequenzen aufgerufen werden, so sind sie jeweils durch ein ; voneinander getrennt.
In meinem Beispiel habe ich ein verschachteltes IF-ELSE-ENDIF-Konstrukt - da ich es ja in Funktionsweise schreiben muß, ist es als IIF-Konstrukt eingesetzt. Je nach zutreffender Bedingung bekommt das Asort das für die beiden gerade zu vergleichenden Elemente zutreffende Kriterium zum sortieren übergeben.
Viele Grüße,
Martin
aah - OK.
Also: ein Codeblock ist immer nach dem Schema { |...| .... } aufgebaut.
Zwischen den beiden || stehen einfach die Variablen, die Du später (hinter den || ) in den Anweisungen verwenden willst.
In meinem Beispiel brauche ich zwei Variablen, die ich miteinander vergleichen will. Da ich ja ein Array verarbeite, steht jede Variable für jeweils ein Element des Arrays - einer kompletten Zeile bei mehrdimensionalen Arrays!
Hinter den beiden || steht die aufzurufende Funktion oder die abzuarbeitende Sequenz - sollen Funktionen bzw. Sequenzen aufgerufen werden, so sind sie jeweils durch ein ; voneinander getrennt.
In meinem Beispiel habe ich ein verschachteltes IF-ELSE-ENDIF-Konstrukt - da ich es ja in Funktionsweise schreiben muß, ist es als IIF-Konstrukt eingesetzt. Je nach zutreffender Bedingung bekommt das Asort das für die beiden gerade zu vergleichenden Elemente zutreffende Kriterium zum sortieren übergeben.
Viele Grüße,
Martin
- Manfred
- Foren-Administrator
- Beiträge: 21224
- Registriert: Di, 29. Nov 2005 16:58
- Wohnort: Kreis Wesel
- Hat sich bedankt: 210 Mal
- Danksagung erhalten: 67 Mal
Hallo Martin,
Aber mit jedem EVAL Durchlauf immer wieder.. Ich glaube da habe ich im Moment die Bremse..
Bis hierhin ist alles klar.Martin Altmann hat geschrieben:Hallo Manfred,
aah - OK.
Also: ein Codeblock ist immer nach dem Schema { |...| .... } aufgebaut.
Zwischen den beiden || stehen einfach die Variablen, die Du später (hinter den || ) in den Anweisungen verwenden willst.
Auch verstanden. (Zumindest in der Darbietung)In meinem Beispiel brauche ich zwei Variablen, die ich miteinander vergleichen will. Da ich ja ein Array verarbeite, steht jede Variable für jeweils ein Element des Arrays - einer kompletten Zeile bei mehrdimensionalen Arrays!
Aha, und hier geht es los. Das ich Funktionen damit aufrufen kann, war mir auch klar. Heißt das, ich kann x-beliebig viele mit ";" getrennte Funktionen aufrufen ? Werden die jetzt nacheinander aufgerufen?Hinter den beiden || steht die aufzurufende Funktion oder die abzuarbeitende Sequenz - sollen Funktionen bzw. Sequenzen aufgerufen werden, so sind sie jeweils durch ein ; voneinander getrennt.
Aber mit jedem EVAL Durchlauf immer wieder.. Ich glaube da habe ich im Moment die Bremse..
Gruß Manfred
Mitglied der XUG Osnabrück
Schatzmeister des Deutschsprachige Xbase-Entwickler e.V.
großer Fan des Xbaseentwicklerwiki https://wiki.xbaseentwickler.de/index.p ... Hauptseite
Doof kann man sein, man muß sich nur zu helfen wissen!!
Mitglied der XUG Osnabrück
Schatzmeister des Deutschsprachige Xbase-Entwickler e.V.
großer Fan des Xbaseentwicklerwiki https://wiki.xbaseentwickler.de/index.p ... Hauptseite
Doof kann man sein, man muß sich nur zu helfen wissen!!
- Martin Altmann
- Foren-Administrator
- Beiträge: 16555
- Registriert: Fr, 23. Sep 2005 4:58
- Wohnort: Berlin
- Hat sich bedankt: 115 Mal
- Danksagung erhalten: 48 Mal
- Kontaktdaten:
Hallo Manfred,
Viele Grüße,
Martin
Jup!Manfred hat geschrieben:Aha, und hier geht es los. Das ich Funktionen damit aufrufen kann, war mir auch klar. Heißt das, ich kann x-beliebig viele mit ";" getrennte Funktionen aufrufen ?
Jup!Manfred hat geschrieben:Werden die jetzt nacheinander aufgerufen?
Nochmal Jup!Manfred hat geschrieben:Aber mit jedem EVAL Durchlauf immer wieder..
Viele Grüße,
Martin
- Manfred
- Foren-Administrator
- Beiträge: 21224
- Registriert: Di, 29. Nov 2005 16:58
- Wohnort: Kreis Wesel
- Hat sich bedankt: 210 Mal
- Danksagung erhalten: 67 Mal
Hi Martin,
na gut, dann muß ich mir mal etwas basteln und es nochmals probieren, ob ich jetzt besser damit klar komme.
Wenn nicht, dann werde ich nochmals nachfragen.
Danke erst einmal
na gut, dann muß ich mir mal etwas basteln und es nochmals probieren, ob ich jetzt besser damit klar komme.
Wenn nicht, dann werde ich nochmals nachfragen.
Danke erst einmal
Gruß Manfred
Mitglied der XUG Osnabrück
Schatzmeister des Deutschsprachige Xbase-Entwickler e.V.
großer Fan des Xbaseentwicklerwiki https://wiki.xbaseentwickler.de/index.p ... Hauptseite
Doof kann man sein, man muß sich nur zu helfen wissen!!
Mitglied der XUG Osnabrück
Schatzmeister des Deutschsprachige Xbase-Entwickler e.V.
großer Fan des Xbaseentwicklerwiki https://wiki.xbaseentwickler.de/index.p ... Hauptseite
Doof kann man sein, man muß sich nur zu helfen wissen!!
- Tom
- Der Entwickler von "Deep Thought"
- Beiträge: 9394
- Registriert: Do, 22. Sep 2005 23:11
- Wohnort: Berlin
- Hat sich bedankt: 104 Mal
- Danksagung erhalten: 364 Mal
- Kontaktdaten:
Hallo, Martin, hallo, Manfred.
Und das bedeutet, daß ihm als Parameter die alte Größe, die neue Größe und das Fensterobjekt selbst übergeben werden. Wenn ich diese Informationen im nachfolgenden Codeblock, der genaugenommen nur eine Liste von Anweisungen (Achtung: Keine Befehle verwenden!) ist, verwenden will, besetze ich ihn entsprechend:
Dann kann ich die beiden Arrays mit den Größen oder das Fensterobjekt selbst (o) im nachfolgenden Codeblock beliebig manipulieren. Außerdem, und da hat Martin recht, kann ich die Parameterliste ergänzen, um lokale Variablen zu definieren, die ich im Codeblock benutzen will. Diese Variablen müßten dann dem definierten Parameterbereich folgen:
Das ist nicht ganz richtig. Bei Codeblöcken, die in Xbase-Klassen, aber auch in anderen Bereichen Methoden bzw. Slots als Callbacks zugeordnet sind, bestimmt die Klasse, welche Parameter an den Codeblock übergeben werden. Dieser Parameter kann dann zwischen den || referenziert werden, sofern er gebraucht wird. Ein gutes Beispiel hierfür sind die :resize-Slots (Methode resize()) der Klasse XbpWindow. Die Docs sagen, daß der Slot so auszusehen hat:Zwischen den beiden || stehen einfach die Variablen, die Du später (hinter den || ) in den Anweisungen verwenden willst.
Code: Alles auswählen
:resize := {| aOldSize, aNewSize, self | ... }
Und das bedeutet, daß ihm als Parameter die alte Größe, die neue Größe und das Fensterobjekt selbst übergeben werden. Wenn ich diese Informationen im nachfolgenden Codeblock, der genaugenommen nur eine Liste von Anweisungen (Achtung: Keine Befehle verwenden!) ist, verwenden will, besetze ich ihn entsprechend:
Code: Alles auswählen
:resize := {| a1, a2, o | ... }
Code: Alles auswählen
:resize := {| a1, a2, o, i, j, k | ... }
Herzlich,
Tom
Tom
- Manfred
- Foren-Administrator
- Beiträge: 21224
- Registriert: Di, 29. Nov 2005 16:58
- Wohnort: Kreis Wesel
- Hat sich bedankt: 210 Mal
- Danksagung erhalten: 67 Mal
Hi,
ich setze die Frage nochmal hier hinter, weil sie wohl ein wenig damit zu tun hat:
Kann ich das hier noch vereinfachen?
kann ich die For next Schleife durch irgendwas im eval() ersetzen, also, dass ich eval irgendwie mitteile, wie oft es ausgeführt werden soll?
ich setze die Frage nochmal hier hinter, weil sie wohl ein wenig damit zu tun hat:
Kann ich das hier noch vereinfachen?
Code: Alles auswählen
for I := 1 TO LEN(array)
eval(führeaus())
next
Gruß Manfred
Mitglied der XUG Osnabrück
Schatzmeister des Deutschsprachige Xbase-Entwickler e.V.
großer Fan des Xbaseentwicklerwiki https://wiki.xbaseentwickler.de/index.p ... Hauptseite
Doof kann man sein, man muß sich nur zu helfen wissen!!
Mitglied der XUG Osnabrück
Schatzmeister des Deutschsprachige Xbase-Entwickler e.V.
großer Fan des Xbaseentwicklerwiki https://wiki.xbaseentwickler.de/index.p ... Hauptseite
Doof kann man sein, man muß sich nur zu helfen wissen!!
- Tom
- Der Entwickler von "Deep Thought"
- Beiträge: 9394
- Registriert: Do, 22. Sep 2005 23:11
- Wohnort: Berlin
- Hat sich bedankt: 104 Mal
- Danksagung erhalten: 364 Mal
- Kontaktdaten:
Hallo, Manfred.
Der Code sieht ein bißchen seltsam aus. Ich nehme an, daß Deine Funktion "fuehreaus()" einen Codeblock zurückliefert?
Eval() evaluiert einen Codeblock ein einziges Mal. Das ist hilfreich, wenn man zum Beispiel Codeblöcke verschachteln will oder wenn man Codeblöcke in Variablen gespeichert hat:
Wenn Du einen Codeblock n Male ausführen willst, wobei n entweder die Länge eines Arrays ist oder die Anzahl der Datensätze einer Tabelle, die einer Bedingung genügen, benutzt Du AEval() (erster Fall) oder DbEval() (zweiter Fall). Wie gesagt, Eval() evaluiert einen Codeblock ein einziges Mal.
Ergänzung: Eval() hat auch noch einen ganz besonderen Zweck, man kann mit Hilfe dieser wunderbaren Funktion nämlich ziemlich leicht sog. "data driven"-Applikationen bauen. Da Codeblöcke (als Text) zum Beispiel auch in Tabellen gespeichert werden können, kann man auf diese Art Code ausführen, der in Datenbanken steht.
Der Code sieht ein bißchen seltsam aus. Ich nehme an, daß Deine Funktion "fuehreaus()" einen Codeblock zurückliefert?
Eval() evaluiert einen Codeblock ein einziges Mal. Das ist hilfreich, wenn man zum Beispiel Codeblöcke verschachteln will oder wenn man Codeblöcke in Variablen gespeichert hat:
Code: Alles auswählen
bBlock := {||machediesunddas()}
...
Eval(bBlock) // an zig Stellen
Ergänzung: Eval() hat auch noch einen ganz besonderen Zweck, man kann mit Hilfe dieser wunderbaren Funktion nämlich ziemlich leicht sog. "data driven"-Applikationen bauen. Da Codeblöcke (als Text) zum Beispiel auch in Tabellen gespeichert werden können, kann man auf diese Art Code ausführen, der in Datenbanken steht.
Herzlich,
Tom
Tom
- Manfred
- Foren-Administrator
- Beiträge: 21224
- Registriert: Di, 29. Nov 2005 16:58
- Wohnort: Kreis Wesel
- Hat sich bedankt: 210 Mal
- Danksagung erhalten: 67 Mal
Hi Tom,
ich Doof. Genau, da sollte eigentlich ein Aeval hin. Werde ich gleich mal probieren. eval(array[1]) Dann dürfte das so klappen.
Manchmal fällt der Euro centweise....... tsetsetse
ich Doof. Genau, da sollte eigentlich ein Aeval hin. Werde ich gleich mal probieren. eval(array[1]) Dann dürfte das so klappen.
Manchmal fällt der Euro centweise....... tsetsetse
Gruß Manfred
Mitglied der XUG Osnabrück
Schatzmeister des Deutschsprachige Xbase-Entwickler e.V.
großer Fan des Xbaseentwicklerwiki https://wiki.xbaseentwickler.de/index.p ... Hauptseite
Doof kann man sein, man muß sich nur zu helfen wissen!!
Mitglied der XUG Osnabrück
Schatzmeister des Deutschsprachige Xbase-Entwickler e.V.
großer Fan des Xbaseentwicklerwiki https://wiki.xbaseentwickler.de/index.p ... Hauptseite
Doof kann man sein, man muß sich nur zu helfen wissen!!
- brandelh
- Foren-Moderator
- Beiträge: 15707
- Registriert: Mo, 23. Jan 2006 20:54
- Wohnort: Germersheim
- Hat sich bedankt: 70 Mal
- Danksagung erhalten: 34 Mal
- Kontaktdaten:
Hallo Manfred,
ich denke ich weiß was du willst.
liege ich richtig ?
ich denke ich weiß was du willst.
Code: Alles auswählen
aCode := { {|| Mach1() } ,;
{|| Mach2() } ,;
{|| Mach3() } }
[color=red]statt ....[/color]
for x := 1 to len(aCode)
eval( aCode[x] )
next
[color=red]willst du kein FOR NEXT:[/color]
aEval(aCode , {|aB| eval( aB ) } )
Gruß
Hubert
Hubert
- Manfred
- Foren-Administrator
- Beiträge: 21224
- Registriert: Di, 29. Nov 2005 16:58
- Wohnort: Kreis Wesel
- Hat sich bedankt: 210 Mal
- Danksagung erhalten: 67 Mal
Moin Tom,
ich habe gestern etwas hektisch geantwortet. Natürlich nicht so wie ich geschrieben hatte.
Man sollte erst das Gehirn einschalten und dann schreiben....
Es ist halt im Kopf, aber noch nicht so locker, dass ich es blind heraus richtig schreibe, bzw. mir sofort auffällt, wenn es Mist ist.
@Hubert,
das meinte ich. Aber gestern war es einfach irgendwie falsch rausgekommen.
ich habe gestern etwas hektisch geantwortet. Natürlich nicht so wie ich geschrieben hatte.
Man sollte erst das Gehirn einschalten und dann schreiben....
Es ist halt im Kopf, aber noch nicht so locker, dass ich es blind heraus richtig schreibe, bzw. mir sofort auffällt, wenn es Mist ist.
@Hubert,
das meinte ich. Aber gestern war es einfach irgendwie falsch rausgekommen.
Gruß Manfred
Mitglied der XUG Osnabrück
Schatzmeister des Deutschsprachige Xbase-Entwickler e.V.
großer Fan des Xbaseentwicklerwiki https://wiki.xbaseentwickler.de/index.p ... Hauptseite
Doof kann man sein, man muß sich nur zu helfen wissen!!
Mitglied der XUG Osnabrück
Schatzmeister des Deutschsprachige Xbase-Entwickler e.V.
großer Fan des Xbaseentwicklerwiki https://wiki.xbaseentwickler.de/index.p ... Hauptseite
Doof kann man sein, man muß sich nur zu helfen wissen!!
- Manfred
- Foren-Administrator
- Beiträge: 21224
- Registriert: Di, 29. Nov 2005 16:58
- Wohnort: Kreis Wesel
- Hat sich bedankt: 210 Mal
- Danksagung erhalten: 67 Mal
nochmal ein Brett vor dem Kopf
das klappt,
das klappt nicht.
Kann man hier schon auf den 1.Blick einen Fehler entdecken, oder werden noch weitere Infos benötigt?
das klappt,
Code: Alles auswählen
nLen := LEN(::aStrukturerweitert)
FOR nI := 1 TO nLen
aadd(::aStruktur, {::aStrukturerweitert[nI,1],;
::aStrukturerweitert[nI,2],;
::aStrukturerweitert[nI,3],;
::aStrukturerweitert[nI,4]})
next
Code: Alles auswählen
AEval(::aStrukturerweitert,{|nI| AAdd(::aStruktur, {::aStrukturErweitert[nI,1],;
::aStrukturErweitert[nI,2],;
::aStrukturErweitert[nI,3],;
::aStrukturErweitert[nI,4]})})
Gruß Manfred
Mitglied der XUG Osnabrück
Schatzmeister des Deutschsprachige Xbase-Entwickler e.V.
großer Fan des Xbaseentwicklerwiki https://wiki.xbaseentwickler.de/index.p ... Hauptseite
Doof kann man sein, man muß sich nur zu helfen wissen!!
Mitglied der XUG Osnabrück
Schatzmeister des Deutschsprachige Xbase-Entwickler e.V.
großer Fan des Xbaseentwicklerwiki https://wiki.xbaseentwickler.de/index.p ... Hauptseite
Doof kann man sein, man muß sich nur zu helfen wissen!!
- brandelh
- Foren-Moderator
- Beiträge: 15707
- Registriert: Mo, 23. Jan 2006 20:54
- Wohnort: Germersheim
- Hat sich bedankt: 70 Mal
- Danksagung erhalten: 34 Mal
- Kontaktdaten:
was war nochmal der 1. Parameter von aEvals Codeblock ?Manfred hat geschrieben:nochmal ein Brett vor dem Kopf ...
Genau, das Subarrayelement (hier die Strukturbeschreibung eines Feldes):
So - sollte - es klappen:
Code: Alles auswählen
AEval(::aStrukturerweitert,{|aStruErw| AAdd(::aStruktur, {aStruErw[1],;
aStruErw[2],;
aStruErw[3],;
aStruErw[4]})})
Code: Alles auswählen
AEval(::aStrukturerweitert,{|aStruErw| AAdd(::aStruktur, aStruErw)}) [color=red]// FALSCH ![/color]
Gruß
Hubert
Hubert
- Manfred
- Foren-Administrator
- Beiträge: 21224
- Registriert: Di, 29. Nov 2005 16:58
- Wohnort: Kreis Wesel
- Hat sich bedankt: 210 Mal
- Danksagung erhalten: 67 Mal
hmhmhmhm,
ich dachte es wäre der Parameter, der hochgezählt wird.
Also habe ich das immer noch nicht richtig verstanden......
So ein Mist.
Also nochmal testen und verinnerlichen.
Danke Hubert, ich wußte es war mal wieder etwas saudoofes von mir.
ich dachte es wäre der Parameter, der hochgezählt wird.
Also habe ich das immer noch nicht richtig verstanden......
So ein Mist.
Also nochmal testen und verinnerlichen.
Danke Hubert, ich wußte es war mal wieder etwas saudoofes von mir.
Gruß Manfred
Mitglied der XUG Osnabrück
Schatzmeister des Deutschsprachige Xbase-Entwickler e.V.
großer Fan des Xbaseentwicklerwiki https://wiki.xbaseentwickler.de/index.p ... Hauptseite
Doof kann man sein, man muß sich nur zu helfen wissen!!
Mitglied der XUG Osnabrück
Schatzmeister des Deutschsprachige Xbase-Entwickler e.V.
großer Fan des Xbaseentwicklerwiki https://wiki.xbaseentwickler.de/index.p ... Hauptseite
Doof kann man sein, man muß sich nur zu helfen wissen!!
- brandelh
- Foren-Moderator
- Beiträge: 15707
- Registriert: Mo, 23. Jan 2006 20:54
- Wohnort: Germersheim
- Hat sich bedankt: 70 Mal
- Danksagung erhalten: 34 Mal
- Kontaktdaten:
Hallo Manfred,
das ist auch in der Doku nicht richtig erklärt.
Nur in den Beispielen findet wan die Parameter des Codeblocks.
Dass dieser Codeblock als 2. Parameter den laufenden Index enthält, wusste ich z.B. nicht, bevor ich TOMs Message sah.
Das steht in einem der unteren Beispiele der online Hilfe.
das ist auch in der Doku nicht richtig erklärt.
Nur in den Beispielen findet wan die Parameter des Codeblocks.
Dass dieser Codeblock als 2. Parameter den laufenden Index enthält, wusste ich z.B. nicht, bevor ich TOMs Message sah.
Das steht in einem der unteren Beispiele der online Hilfe.
Sollte ich es nur nicht gefunden haben, dürft ihr auf mich einprügelnaEval( aArray , { |aArrayZeile, nZeilenIndex| ... } )
Gruß
Hubert
Hubert
- Manfred
- Foren-Administrator
- Beiträge: 21224
- Registriert: Di, 29. Nov 2005 16:58
- Wohnort: Kreis Wesel
- Hat sich bedankt: 210 Mal
- Danksagung erhalten: 67 Mal
Hi,
noch etwas zum Thema (denke ich mal)
bDarst war mal zu Anfang in den Systemparametern deklariert. So wie es oben steht klappt es .
Jetzt habe ich es umgeändert, weil ich bDarst direkt der Klasse zugeordnet habe. Kommt sonst nirgends vor.
Das sieht dann jetzt so aus.
Jetzt klappt es nicht mehr. Sobald der Index aufgebaut wird, kommt die Fehlermeldung das "objekt" nicht bekannt ist. Mit "self" ist es das gleiche. Hier versagt mein Wissen. Kann mir jemand helfen?
noch etwas zum Thema (denke ich mal)
Code: Alles auswählen
METHOD _interpret:initstruktur(objekt)
memvar oSysPara
objekt:bDarst := {|| objekt:indexOhneArtikel(Upper(FIELD->bez))}
objekt:aIndex := {;
{"ID" ,"Str(id,8,0)","ID",.F.},;
{"BEZ","Eval(oSysPara:bDarst)","Interpret",.F.};
}
RETURN self
Jetzt habe ich es umgeändert, weil ich bDarst direkt der Klasse zugeordnet habe. Kommt sonst nirgends vor.
Das sieht dann jetzt so aus.
Code: Alles auswählen
METHOD _interpret:initstruktur(objekt)
objekt:bDarst := {|| objekt:indexOhneArtikel(Upper(FIELD->bez))}
objekt:aIndex := {;
{"ID" ,"Str(id,8,0)","ID",.F.},;
{"BEZ","Eval(objekt:bDarst)","Interpret",.F.};
}
RETURN self
Gruß Manfred
Mitglied der XUG Osnabrück
Schatzmeister des Deutschsprachige Xbase-Entwickler e.V.
großer Fan des Xbaseentwicklerwiki https://wiki.xbaseentwickler.de/index.p ... Hauptseite
Doof kann man sein, man muß sich nur zu helfen wissen!!
Mitglied der XUG Osnabrück
Schatzmeister des Deutschsprachige Xbase-Entwickler e.V.
großer Fan des Xbaseentwicklerwiki https://wiki.xbaseentwickler.de/index.p ... Hauptseite
Doof kann man sein, man muß sich nur zu helfen wissen!!
- brandelh
- Foren-Moderator
- Beiträge: 15707
- Registriert: Mo, 23. Jan 2006 20:54
- Wohnort: Germersheim
- Hat sich bedankt: 70 Mal
- Danksagung erhalten: 34 Mal
- Kontaktdaten:
Hallo Manfred,
kannst du dich an den Unterschied von PRIVATE / PUBLIC und LOCAL Variablen erinnern ?
Du speicherst einen Variablennamen in einen Text um ihn später irgendwann im Programm auszuführen. NUR memvar (PRIVATE / PUBLIC) Variablen sind dort bekannt. Die LOCAL wurden schon beim Compilieren von einem Namen in eine Speicherreferenz geändert.
Daher hast du oben auch eine MEMVAR Variable benutzt.
kannst du dich an den Unterschied von PRIVATE / PUBLIC und LOCAL Variablen erinnern ?
Du speicherst einen Variablennamen in einen Text um ihn später irgendwann im Programm auszuführen. NUR memvar (PRIVATE / PUBLIC) Variablen sind dort bekannt. Die LOCAL wurden schon beim Compilieren von einem Namen in eine Speicherreferenz geändert.
Daher hast du oben auch eine MEMVAR Variable benutzt.
Gruß
Hubert
Hubert
- Manfred
- Foren-Administrator
- Beiträge: 21224
- Registriert: Di, 29. Nov 2005 16:58
- Wohnort: Kreis Wesel
- Hat sich bedankt: 210 Mal
- Danksagung erhalten: 67 Mal
Hi Hubert,
sicherlich, aber ich komme einfach nicht weiter, wie ich das jetzt gelöst bekomme. Ich habe etliche alte Tipps von Dir durchgesehen, aber im Moment habe ich ein Brett vor dem Kopf.
Ich habe auch etliches ausprobiert, aber ich denke mal, die falsche Richtung.
sicherlich, aber ich komme einfach nicht weiter, wie ich das jetzt gelöst bekomme. Ich habe etliche alte Tipps von Dir durchgesehen, aber im Moment habe ich ein Brett vor dem Kopf.
Ich habe auch etliches ausprobiert, aber ich denke mal, die falsche Richtung.
Gruß Manfred
Mitglied der XUG Osnabrück
Schatzmeister des Deutschsprachige Xbase-Entwickler e.V.
großer Fan des Xbaseentwicklerwiki https://wiki.xbaseentwickler.de/index.p ... Hauptseite
Doof kann man sein, man muß sich nur zu helfen wissen!!
Mitglied der XUG Osnabrück
Schatzmeister des Deutschsprachige Xbase-Entwickler e.V.
großer Fan des Xbaseentwicklerwiki https://wiki.xbaseentwickler.de/index.p ... Hauptseite
Doof kann man sein, man muß sich nur zu helfen wissen!!
- brandelh
- Foren-Moderator
- Beiträge: 15707
- Registriert: Mo, 23. Jan 2006 20:54
- Wohnort: Germersheim
- Hat sich bedankt: 70 Mal
- Danksagung erhalten: 34 Mal
- Kontaktdaten:
Manfreds CODE:
Es gibt 2 Lösungen (oder mehr ?)
1. Du kopierst den Inhalt von objekt:bDarst wieder in eine PRIVATE um bzw. gehst auf den alten Code zurück, wobei hier natürlich immer die Gefahr besteht, dass zur Laufzeit in objekt:bDarst schon was anderes steht als du in der PRIVATE gespeichert hast ...
2. Du löst den Inhalt in einen Codeblock auf z.B.
ALT :
NEU - und besser:
Was nun bei dir besser passt, weiß ich auch nicht.
Code: Alles auswählen
METHOD _interpret:initstruktur(objekt) //[color=red] <- objekt ist eine LOCAL[/color]
memvar oSysPara [color=red]<- oSysPara ist eine PRIVATE / Public [/color]
objekt:bDarst := {|| objekt:indexOhneArtikel(Upper(FIELD->bez))}
[color=red]in der oberen Zeile wird direkt ein Codeblock generiert (keine " -> kein & Operator, daher kann man hier auch LOCALs verwenden -> detached LOCALS[/color]
objekt:aIndex := {;
{"ID" ,"Str(id,8,0)","ID",.F.},;
{"BEZ","Eval(oSysPara:bDarst)","Interpret",.F.};
}
[color=red]hier wird mit oSysPara ... eine PRIVATE / PUBLIC ... verwendet, dies geht da diese Variablen zur Laufzeit über den NAMEN angesprochen werden.[/color]
......
objekt:aIndex := {;
{"ID" ,"Str(id,8,0)","ID",.F.},;
{"BEZ",[color=red]"Eval(objekt:bDarst)"[/color],"Interpret",.F.};
[color=red]hier versuchst du eine LOCAL als Referenz in einen String zu packen, das geht nicht ![/color]
1. Du kopierst den Inhalt von objekt:bDarst wieder in eine PRIVATE um bzw. gehst auf den alten Code zurück, wobei hier natürlich immer die Gefahr besteht, dass zur Laufzeit in objekt:bDarst schon was anderes steht als du in der PRIVATE gespeichert hast ...
2. Du löst den Inhalt in einen Codeblock auf z.B.
ALT :
Code: Alles auswählen
field Strasse, Ort
private SuchStrasse, SuchOrt, bSuch
SuchStrasse := "Weg"
SuchOrt := "Mainz"
bSuch := {|| Strasse = SuchStrasse .and. Ort = SuchOrt }
Code: Alles auswählen
field Strasse, Ort
local SuchStrasse, SuchOrt, bSuch, cSuch
SuchStrasse := "Weg"
SuchOrt := "Mainz"
cSuch := "{|| DB->Strasse = '"+alltrim(SuchStrasse)+"' .and. "+;
DB->Ort = '"+alltrim(SuchOrt)+"' }"
[color=red]// ich trenne dies immer, da ich so einfach den Text ansehen kann ![/color]
bSuch := &(cSuch)
Gruß
Hubert
Hubert
- Manfred
- Foren-Administrator
- Beiträge: 21224
- Registriert: Di, 29. Nov 2005 16:58
- Wohnort: Kreis Wesel
- Hat sich bedankt: 210 Mal
- Danksagung erhalten: 67 Mal
Hi Hubert,
danke erstmal. Ich werde es bis auf weiteres wieder als Memvar machen. Es sollte übrigens bei der Memvar oSysPara:bDarst auch darunter oSysPara:bDarst und nicht objek:bDarst := {|| } heißen. Habe mich verschrieben.
danke erstmal. Ich werde es bis auf weiteres wieder als Memvar machen. Es sollte übrigens bei der Memvar oSysPara:bDarst auch darunter oSysPara:bDarst und nicht objek:bDarst := {|| } heißen. Habe mich verschrieben.
Gruß Manfred
Mitglied der XUG Osnabrück
Schatzmeister des Deutschsprachige Xbase-Entwickler e.V.
großer Fan des Xbaseentwicklerwiki https://wiki.xbaseentwickler.de/index.p ... Hauptseite
Doof kann man sein, man muß sich nur zu helfen wissen!!
Mitglied der XUG Osnabrück
Schatzmeister des Deutschsprachige Xbase-Entwickler e.V.
großer Fan des Xbaseentwicklerwiki https://wiki.xbaseentwickler.de/index.p ... Hauptseite
Doof kann man sein, man muß sich nur zu helfen wissen!!