Clipper 97 goes Xbase++ goes MDI ?
Moderator: Moderatoren
- 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:
Re: Clipper 97 goes Xbase++ goes MDI ?
Hallo, Klaus.
COMMIT (als Befehl) oder DbCommit() (als Funktionsaufruf) sorgen dafür, dass die Daten durchgeschrieben werden. Das kann man im Prinzip beliebig oft machen, aber es bremst auf Dauer. DbSkip(0) bewirkt ähnliches für einen einzelnen Datensatz. Sinnvoller wäre es allerdings, die Fehler zu beseitigen, die dazu führen, dass Xbase (bzw. eigentlich: Dein Programm) aussteigt. Man kann solche Prozesse - also das Durchschreiben von Daten - auch in SEQUENCES legen, die dann auch mit Rollbacks ausgestattet sein können. Wenn dann ein Fehler auftritt, wird es z.B. abermals versucht, oder die Ursprungsdaten werden restauriert oder so. Aber, wie gesagt: Fehler ausmerzen!
COMMIT (als Befehl) oder DbCommit() (als Funktionsaufruf) sorgen dafür, dass die Daten durchgeschrieben werden. Das kann man im Prinzip beliebig oft machen, aber es bremst auf Dauer. DbSkip(0) bewirkt ähnliches für einen einzelnen Datensatz. Sinnvoller wäre es allerdings, die Fehler zu beseitigen, die dazu führen, dass Xbase (bzw. eigentlich: Dein Programm) aussteigt. Man kann solche Prozesse - also das Durchschreiben von Daten - auch in SEQUENCES legen, die dann auch mit Rollbacks ausgestattet sein können. Wenn dann ein Fehler auftritt, wird es z.B. abermals versucht, oder die Ursprungsdaten werden restauriert oder so. Aber, wie gesagt: Fehler ausmerzen!
Herzlich,
Tom
Tom
- brandelh
- Foren-Moderator
- Beiträge: 15707
- Registriert: Mo, 23. Jan 2006 20:54
- Wohnort: Germersheim
- Hat sich bedankt: 71 Mal
- Danksagung erhalten: 38 Mal
- Kontaktdaten:
Re: Clipper 97 goes Xbase++ goes MDI ?
DBSKIP() schreibt Puffer weg UND liest sie neu ein, somit erhält er auch Änderungen die von anderen Stationen durchgeführt wurden.
COMMIT weißt den Server an die Puffer wegzuschreiben, allerdings nicht den Client seine neu einzulesen.
Änderungen anderer Stationen werden so nicht sofort sichbar.
Eine sequenzielle ID ist ein großes Problem, hier musst du per Programm sicher stellen, dass nicht auch eine andere Station das Gleiche macht:
Problem:
PC1: go bottom, Nr merken, append blank, replace mit nr+1 ...
PC2: go bottom, Nr merken, append blank, replace mit nr+1 ...
PC3: go bottom, Nr merken, append blank, replace mit nr+1 ...
wenn alle genau die gleichen Daten lesen werden hier 3 gleiche IDs vergeben.
wenn einer etwas später ist also zwischen append blank und replace gerät, gibt es mehree mit ID=1 etc.
Denn alle können lesen während ein Satz gesperrt ist.
Ich habe das damals so gelöst, dass ich entweder den letzten Satz mir rlock() oder die ganze Datei mit flock() gesperrt habe,
bevor ich die NR ausgelesen habe. Beim dann folgenden Append Blank wird dieser ja sofort gesperrt und somit ist auch
die rlock() Variante recht sicher, am sichersten bleibt aber flock().
COMMIT weißt den Server an die Puffer wegzuschreiben, allerdings nicht den Client seine neu einzulesen.
Änderungen anderer Stationen werden so nicht sofort sichbar.
Eine sequenzielle ID ist ein großes Problem, hier musst du per Programm sicher stellen, dass nicht auch eine andere Station das Gleiche macht:
Problem:
PC1: go bottom, Nr merken, append blank, replace mit nr+1 ...
PC2: go bottom, Nr merken, append blank, replace mit nr+1 ...
PC3: go bottom, Nr merken, append blank, replace mit nr+1 ...
wenn alle genau die gleichen Daten lesen werden hier 3 gleiche IDs vergeben.
wenn einer etwas später ist also zwischen append blank und replace gerät, gibt es mehree mit ID=1 etc.
Denn alle können lesen während ein Satz gesperrt ist.
Ich habe das damals so gelöst, dass ich entweder den letzten Satz mir rlock() oder die ganze Datei mit flock() gesperrt habe,
bevor ich die NR ausgelesen habe. Beim dann folgenden Append Blank wird dieser ja sofort gesperrt und somit ist auch
die rlock() Variante recht sicher, am sichersten bleibt aber flock().
Gruß
Hubert
Hubert
- 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:
Re: Clipper 97 goes Xbase++ goes MDI ?
Die Vergabe von eindeutigen Nummern im Netzwerk haben wir schon häufiger diskutiert, zum Beispiel hier:
http://www.xbaseforum.de/viewtopic.php?f=24&t=1563
Ich habe für derlei eine Hilfsdatei mit einem Datensatz, die ich nur für die Nummernvergabe öffne. Ich sperre den ersten Datensatz, hole mir meine Nummer, aktualisiere sie im Datensatz und entsperre und schließe dann wieder. Das dauert nur ein paar Millisekunden. Andere Arbeitsplätze warten so lange, bis sie diesen Datensatz ebenfalls sperren können - was keine spürbaren Wartezeiten verursacht. (DO WHILE !Rlock() ; Sleep(0) ; ENDDO). Die Nummer ist dann immer aktuell und richtig.
Ansonsten bietet die FOXDBE auch den Feldtyp "Integer/Autoinc." (Feldtyp "S"). Die Umstellung auf FOX ist bei kleineren Applikationen kein großer Aufwand, und nach einem APPEND BLANK hat das Feld schon die richtige (eindeutige) Nummer.
http://www.xbaseforum.de/viewtopic.php?f=24&t=1563
Ich habe für derlei eine Hilfsdatei mit einem Datensatz, die ich nur für die Nummernvergabe öffne. Ich sperre den ersten Datensatz, hole mir meine Nummer, aktualisiere sie im Datensatz und entsperre und schließe dann wieder. Das dauert nur ein paar Millisekunden. Andere Arbeitsplätze warten so lange, bis sie diesen Datensatz ebenfalls sperren können - was keine spürbaren Wartezeiten verursacht. (DO WHILE !Rlock() ; Sleep(0) ; ENDDO). Die Nummer ist dann immer aktuell und richtig.
Ansonsten bietet die FOXDBE auch den Feldtyp "Integer/Autoinc." (Feldtyp "S"). Die Umstellung auf FOX ist bei kleineren Applikationen kein großer Aufwand, und nach einem APPEND BLANK hat das Feld schon die richtige (eindeutige) Nummer.
Herzlich,
Tom
Tom
- AUGE_OHR
- Marvin
- Beiträge: 12913
- Registriert: Do, 16. Mär 2006 7:55
- Wohnort: Hamburg
- Hat sich bedankt: 19 Mal
- Danksagung erhalten: 46 Mal
Re: Clipper 97 goes Xbase++ goes MDI ?
hi,
beides "müsste" doch den "Zähler" erhöhen ... warum klappt bei mir Variante 1 nicht
Code: Alles auswählen
// klappt nicht ?
::nCounter := KUNDEN->IDNO
KUNDEN->IDNO := ::nCounter++
// funktioniert
REPLACE KUNDEN->IDNO WITH KUNDEN->IDNO+1
::nCounter := KUNDEN->IDNO
gruss by OHR
Jimmy
Jimmy
- brandelh
- Foren-Moderator
- Beiträge: 15707
- Registriert: Mo, 23. Jan 2006 20:54
- Wohnort: Germersheim
- Hat sich bedankt: 71 Mal
- Danksagung erhalten: 38 Mal
- Kontaktdaten:
Re: Clipper 97 goes Xbase++ goes MDI ?
Hallo Jimmy,
weil ein nVar++ erst NACH der Zuweisung ausgeführt wird. nVar+1 hingegen oder ++nVar wird zuerst berechnet und dann zugewiesen.
weil ein nVar++ erst NACH der Zuweisung ausgeführt wird. nVar+1 hingegen oder ++nVar wird zuerst berechnet und dann zugewiesen.
Gruß
Hubert
Hubert
- Martin Altmann
- Foren-Administrator
- Beiträge: 16555
- Registriert: Fr, 23. Sep 2005 4:58
- Wohnort: Berlin
- Hat sich bedankt: 116 Mal
- Danksagung erhalten: 48 Mal
- Kontaktdaten:
Re: Clipper 97 goes Xbase++ goes MDI ?
Geht denn eigentlich ein
Ich denke mal, eher nicht - oder?
Wäre ja doch ein speziellerer Einzelfall...
Viele Grüße,
Martin
Code: Alles auswählen
KUNDEN->IDNO++
Wäre ja doch ein speziellerer Einzelfall...
Viele Grüße,
Martin
Webseite mit XB2.NET und ausschließlich statischem Content in Form von HTML-Dateien: https://www.altem.de/
Webseite mit XB2.NET und ausschließlich dynamischem Content in Form von in-memory-HTML: https://meldungen.altem.de/
Mitglied der XUG Osnabrück
Vorsitzender des Deutschsprachige Xbase-Entwickler e. V.
- AUGE_OHR
- Marvin
- Beiträge: 12913
- Registriert: Do, 16. Mär 2006 7:55
- Wohnort: Hamburg
- Hat sich bedankt: 19 Mal
- Danksagung erhalten: 46 Mal
Re: Clipper 97 goes Xbase++ goes MDI ?
STIMMT !!! ... blame on mebrandelh hat geschrieben:weil ein nVar++ erst NACH der Zuweisung ausgeführt wird. nVar+1 hingegen oder ++nVar wird zuerst berechnet und dann zugewiesen.
hm ... ich wollte das ++ beim 2nd Beispiel vermeiden (was ja der Fehler war)Martin hat geschrieben:KUNDEN->IDNO++
gruss by OHR
Jimmy
Jimmy
- brandelh
- Foren-Moderator
- Beiträge: 15707
- Registriert: Mo, 23. Jan 2006 20:54
- Wohnort: Germersheim
- Hat sich bedankt: 71 Mal
- Danksagung erhalten: 38 Mal
- Kontaktdaten:
Re: Clipper 97 goes Xbase++ goes MDI ?
Martin Altmann hat geschrieben:Geht denn eigentlich einIch denke mal, eher nicht - oder?Code: Alles auswählen
KUNDEN->IDNO++
Wäre ja doch ein speziellerer Einzelfall...
Viele Grüße,
Martin
Code: Alles auswählen
KUNDEN->IDNO++
Laut Dokumentation ist das explizit möglich, ich persönlich nutze aber ausschließlich replace um Datenfelder zu schreiben, so kann ich leicht nach Dateizugriffen suchen.
Gruß
Hubert
Hubert
- Martin Altmann
- Foren-Administrator
- Beiträge: 16555
- Registriert: Fr, 23. Sep 2005 4:58
- Wohnort: Berlin
- Hat sich bedankt: 116 Mal
- Danksagung erhalten: 48 Mal
- Kontaktdaten:
Re: Clipper 97 goes Xbase++ goes MDI ?
Hallo Hubert,
genau darauf wollte ich hinaus.
Ich denke mal, das klappt in dem Fall nicht wirklich.
Obwohl es ja eine atomare Operation wäre
Viele Grüße,
Martin
genau darauf wollte ich hinaus.
Ich denke mal, das klappt in dem Fall nicht wirklich.
Obwohl es ja eine atomare Operation wäre
Viele Grüße,
Martin
Webseite mit XB2.NET und ausschließlich statischem Content in Form von HTML-Dateien: https://www.altem.de/
Webseite mit XB2.NET und ausschließlich dynamischem Content in Form von in-memory-HTML: https://meldungen.altem.de/
Mitglied der XUG Osnabrück
Vorsitzender des Deutschsprachige Xbase-Entwickler e. V.
- brandelh
- Foren-Moderator
- Beiträge: 15707
- Registriert: Mo, 23. Jan 2006 20:54
- Wohnort: Germersheim
- Hat sich bedankt: 71 Mal
- Danksagung erhalten: 38 Mal
- Kontaktdaten:
Re: Clipper 97 goes Xbase++ goes MDI ?
wenn der Satz gesperrt wurde (was zum Lesen ja nicht nötig ist) und Alaska das so umsetzt, warum nicht ... müsste man halt mal ausprobieren.Martin Altmann hat geschrieben:Ich denke mal, das klappt in dem Fall nicht wirklich.
Aber ich mach das nicht, denn der Quellcode ist mir zu unleserlich
Gruß
Hubert
Hubert
- Markus Walter
- Programmier-Gott
- Beiträge: 1018
- Registriert: Di, 24. Jan 2006 10:22
- Wohnort: Saarland
Re: Clipper 97 goes Xbase++ goes MDI ?
Hallo Klaus,KlausXXL hat geschrieben:gibt es eine sichere Möglichkeit sicherzustellen, daß ein Datensatz - der gerade neu angelegt wurde
in der Datenbank abgespeichert ist -- auch wenn kurze Zeit später das Programm mit einer Fehlermeldung
aussteigt ?
sozusagen nach
append blank
...
replace Feld1 with xyz
etc.
und
replace KundNr with Kundnr +1
....
* JETZT ALLES IN DATENBANKEN ABSPEICHERN *
Hintergrund --- wenn xbase durch Fehlermeldung aussteigt sind zu 90% die zuletzt eingegebenen DATEN weg ...
und was noch schlimmer ist eine Kundennummer bzw Terminnummer wird nicht mit +1 abgelegt ,
so daß beim erneuten Start des Programms eine doppelte Terminnummer neu angelegt wird ... was die
ganzen Daten dureinander bringt ....
mfg Klaus
das hängt meines Erachtens davon ab, ob Du die DBF exlusiv oder geshared geöffnet hast. Bei einem exlusiven Zugriff ist wohl dbcommit() das Mittel der Wahl (wie Tom schon geschrieben hat). Bei shared-Zugriff reicht das Entsperren des Datensatzes (dbunlock() oder DbRUnlock()).
Gruß
Markus
Mitglied der XUG Saarland-Pfalz
Markus
Mitglied der XUG Saarland-Pfalz
Re: Clipper 97 goes Xbase++ goes MDI ?
Guten Morgen ,
jetzt am Wochenende habe ich wieder etwas Zeit -- da werde ich eure Vorschläge für
eindeutige Nummernvergabe und Datenspeicherung in das Programm einbauen
Danke habt mir sehr geholfen
Jetzt hätte ich da eigentlich nur noch eine Überlegenung --
für die Tabellenansicht der Termine verwende ich DBEDIT ...
z.B. Tbrowse habe ich noch nie Benutzt --
und wie gesagt hätte ich auch express++ noch zur Verfügung !
Was mich in diesem Zusammenhang interresiert !
1.Kann man irgendwie auf einfache Art und Weise die Tabbellenansicht so ändern , daß
die angezeigten Datensätze mit einer abwechselnden z.B. Hntergrundfarbe dargestellt werden
2. wie sieht der Code aus wenn ich DBEDIT durch TBROWSE ersetzen will -- ist Tbrowse schneller ?
3. geht es auch wenn ich express++ verwende --- was muß ich da ändern ?
Beispiel:
DECLARE Felder [10]
Felder[1]="g"
Felder[2]="termin"
Felder[3]="twoche"
Felder[4]="vertrag"
...
DECLARE Kopf[10]
Kopf[1]="G"
Kopf[2]="Termin"
Kopf[3]="WT"
Kopf[4]="S"
...
clear
@ 0,1 say "[ESC]=Zurck [F2]=... [F3]=... "
@ 41,1 SAY "[F1]=šbersicht [F4]=Anfgen [F5]=Žndern [F8]=...."
...
DBEDIT(1,0,40,115,Felder,"editieren","",Kopf)
..
return
FUNCTION editieren
PARAMETERS Modus, Initial
Zeile=COL()
Reihe=ROW()
Rueck = 1
DO CASE
CASE LASTKEY()=-7
set cursor on
clear gets
SET INTENSITY OFF
SET COLOR TO W+
Infield = Felder[Initial]
@ Reihe, Zeile GET &Infield PICTURE "@K"
READ
SET COLOR TO W
SET INTENSITY ON
set cursor off
case lastkey()=-8
do sd1
...
mfg Klaus
jetzt am Wochenende habe ich wieder etwas Zeit -- da werde ich eure Vorschläge für
eindeutige Nummernvergabe und Datenspeicherung in das Programm einbauen
Danke habt mir sehr geholfen
Jetzt hätte ich da eigentlich nur noch eine Überlegenung --
für die Tabellenansicht der Termine verwende ich DBEDIT ...
z.B. Tbrowse habe ich noch nie Benutzt --
und wie gesagt hätte ich auch express++ noch zur Verfügung !
Was mich in diesem Zusammenhang interresiert !
1.Kann man irgendwie auf einfache Art und Weise die Tabbellenansicht so ändern , daß
die angezeigten Datensätze mit einer abwechselnden z.B. Hntergrundfarbe dargestellt werden
2. wie sieht der Code aus wenn ich DBEDIT durch TBROWSE ersetzen will -- ist Tbrowse schneller ?
3. geht es auch wenn ich express++ verwende --- was muß ich da ändern ?
Beispiel:
DECLARE Felder [10]
Felder[1]="g"
Felder[2]="termin"
Felder[3]="twoche"
Felder[4]="vertrag"
...
DECLARE Kopf[10]
Kopf[1]="G"
Kopf[2]="Termin"
Kopf[3]="WT"
Kopf[4]="S"
...
clear
@ 0,1 say "[ESC]=Zurck [F2]=... [F3]=... "
@ 41,1 SAY "[F1]=šbersicht [F4]=Anfgen [F5]=Žndern [F8]=...."
...
DBEDIT(1,0,40,115,Felder,"editieren","",Kopf)
..
return
FUNCTION editieren
PARAMETERS Modus, Initial
Zeile=COL()
Reihe=ROW()
Rueck = 1
DO CASE
CASE LASTKEY()=-7
set cursor on
clear gets
SET INTENSITY OFF
SET COLOR TO W+
Infield = Felder[Initial]
@ Reihe, Zeile GET &Infield PICTURE "@K"
READ
SET COLOR TO W
SET INTENSITY ON
set cursor off
case lastkey()=-8
do sd1
...
mfg Klaus
- AUGE_OHR
- Marvin
- Beiträge: 12913
- Registriert: Do, 16. Mär 2006 7:55
- Wohnort: Hamburg
- Hat sich bedankt: 19 Mal
- Danksagung erhalten: 46 Mal
Re: Clipper 97 goes Xbase++ goes MDI ?
klar hast du, nur du weist es noch nichtKlausXXL hat geschrieben:Jetzt hätte ich da eigentlich nur noch eine Überlegenung --
für die Tabellenansicht der Termine verwende ich DBEDIT ...
z.B. Tbrowse habe ich noch nie Benutzt --
siehe dir mal c:\ALASKA\XPPW32\Source\SYS\dbedit.prg an !
mittels des Source kannst du dir deine eigene DbEdit/Tbrowse bauen OHNE deinen Code zu ändern
kann ich leider nicht mir dienen, aber es gibt ja andere User die helfen könnenKlausXXL hat geschrieben:und wie gesagt hätte ich auch express++ noch zur Verfügung !
im VIO / Hybrid Mode hab ich mich sehr schwer getan, aber im GUI Mode kein ProblemKlausXXL hat geschrieben: Was mich in diesem Zusammenhang interresiert !
1.Kann man irgendwie auf einfache Art und Weise die Tabbellenansicht so ändern , daß
die angezeigten Datensätze mit einer abwechselnden z.B. Hntergrundfarbe dargestellt werden
wie schon gesagt, sie dir den Source an.KlausXXL hat geschrieben:2. wie sieht der Code aus wenn ich DBEDIT durch TBROWSE ersetzen will -- ist Tbrowse schneller ?
Tbrowse ist deutlich "mächtiger" und die Art und Weise gleicht XbpBrowse()
vermutlich nur wenig ...KlausXXL hat geschrieben:3. geht es auch wenn ich express++ verwende --- was muß ich da ändern ?
Ich "denke", wenn du mit der Command Sprache von Express++ klarkommst, du solltest dich für eins von beiden "entscheiden".
"pure" Xbase++ und Express++ unterscheiden sich im Level gewaltig. Bei "pure" Xbase++ musst du dich "um alles selbst" kümmern
während die 3PP LIB´s wie Express++ dir da schon gewaltig was abnehmen.
gruss by OHR
Jimmy
Jimmy
-
- UDF-Programmierer
- Beiträge: 92
- Registriert: Di, 19. Dez 2006 19:37
- Wohnort: Düsseldorf
- Kontaktdaten:
Re: Clipper 97 goes Xbase++ goes MDI ?
Hallo Klaus,
auch ein sofortiges Schreiben in die Datenbank gibt keine Sicherheit. Beim nächsten Start der Anwendung
sollte der letzte Satz auf Vollständigkeit überprüft werden und die Indizes ggf. erneurt werden.
Früher unter Clipper hatte ich eine Kontrolldatei angelegt um zu dokumentieren ob die Neuanlage eines
Satzes erfolgreich war. Unter DOS konnte man einfach den Bildschirm vor und nach der Aktion sichern.
Heute müsste man dafür alle SLE´s bzw. deren Puffer vor und nach der Änderung sichern.
Gruß
Jürgen
auch ein sofortiges Schreiben in die Datenbank gibt keine Sicherheit. Beim nächsten Start der Anwendung
sollte der letzte Satz auf Vollständigkeit überprüft werden und die Indizes ggf. erneurt werden.
Früher unter Clipper hatte ich eine Kontrolldatei angelegt um zu dokumentieren ob die Neuanlage eines
Satzes erfolgreich war. Unter DOS konnte man einfach den Bildschirm vor und nach der Aktion sichern.
Heute müsste man dafür alle SLE´s bzw. deren Puffer vor und nach der Änderung sichern.
Gruß
Jürgen
- brandelh
- Foren-Moderator
- Beiträge: 15707
- Registriert: Mo, 23. Jan 2006 20:54
- Wohnort: Germersheim
- Hat sich bedankt: 71 Mal
- Danksagung erhalten: 38 Mal
- Kontaktdaten:
Re: Clipper 97 goes Xbase++ goes MDI ?
Hi,
du könntest eine Datei (NR_....txt) mit den Feldnamen und Inhalten speichern (z.B. XML, aber auch einfach eine Textdatei mit eigenem Aufbau).
Dann den Satz erzeugen und alles schreiben.
Danach die Datei umbenennen (NR_....txt -> OK_....txt).
Wenn du bei Öffnen anzulegende Dateien findest (NR_*.txt ?), dann ging wohl was schief.
In dem Falle, zuerst alle Indexe löschen und aufbauen, dann prüfen ob es den Satz eventuell doch schon gibt ... Zeitstempel wären auch nicht schlecht ...
du könntest eine Datei (NR_....txt) mit den Feldnamen und Inhalten speichern (z.B. XML, aber auch einfach eine Textdatei mit eigenem Aufbau).
Dann den Satz erzeugen und alles schreiben.
Danach die Datei umbenennen (NR_....txt -> OK_....txt).
Wenn du bei Öffnen anzulegende Dateien findest (NR_*.txt ?), dann ging wohl was schief.
In dem Falle, zuerst alle Indexe löschen und aufbauen, dann prüfen ob es den Satz eventuell doch schon gibt ... Zeitstempel wären auch nicht schlecht ...
Gruß
Hubert
Hubert
Re: Clipper 97 goes Xbase++ goes MDI ?
Hallo ,
einen wunderschönen Mittag.
Folgende Fehlermeldung gehört auch zu dem Programm - hat jedoch nichts mit der Netzerkfähigkeit zu tun.
AUSLÖSER:
Eingabe von Daten --> FEHLER --> Cursor blinkt im Eingabefeld -- jedoch nichts geht mehr -- kein Tastendruck / NIX
Lösung: Alt -C
habe ich im Moment öfters - kann mir bitte jemand sagen wo der FEHLER liegt -
XBASE Fehlermeldung:
FATAL ERROR LOG
Abort with Alt-C
SYS Thread-ID: 644
Module: EVM
Error Codes: EH: 11 Sub: 0(0) OS: 0 XPP: 0
Call Stack of Thread 1 (500):
TLSA(7)
VEDIT(718)
(B)DBEDIT(0)
DBEDIT(187)
FILTERUNG(785)
EDITTERM(351)
(B)DBEDIT(0)
DBEDIT(187)
PSICHT(200)
AK1(95)
A1(33)
MAIN(360)
File: C:\XB7\project.EXE
TimeStamp: 20100203 11:48
End of FATAL ERROR LOG.
Für Hilfe wäre ich sehr DANKBAR
mfg
einen wunderschönen Mittag.
Folgende Fehlermeldung gehört auch zu dem Programm - hat jedoch nichts mit der Netzerkfähigkeit zu tun.
AUSLÖSER:
Eingabe von Daten --> FEHLER --> Cursor blinkt im Eingabefeld -- jedoch nichts geht mehr -- kein Tastendruck / NIX
Lösung: Alt -C
habe ich im Moment öfters - kann mir bitte jemand sagen wo der FEHLER liegt -
XBASE Fehlermeldung:
FATAL ERROR LOG
Abort with Alt-C
SYS Thread-ID: 644
Module: EVM
Error Codes: EH: 11 Sub: 0(0) OS: 0 XPP: 0
Call Stack of Thread 1 (500):
TLSA(7)
VEDIT(718)
(B)DBEDIT(0)
DBEDIT(187)
FILTERUNG(785)
EDITTERM(351)
(B)DBEDIT(0)
DBEDIT(187)
PSICHT(200)
AK1(95)
A1(33)
MAIN(360)
File: C:\XB7\project.EXE
TimeStamp: 20100203 11:48
End of FATAL ERROR LOG.
Für Hilfe wäre ich sehr DANKBAR
mfg
- Martin Altmann
- Foren-Administrator
- Beiträge: 16555
- Registriert: Fr, 23. Sep 2005 4:58
- Wohnort: Berlin
- Hat sich bedankt: 116 Mal
- Danksagung erhalten: 48 Mal
- Kontaktdaten:
Re: Clipper 97 goes Xbase++ goes MDI ?
Was ist TLSA?
Viele Grüße,
Martin
Viele Grüße,
Martin
Webseite mit XB2.NET und ausschließlich statischem Content in Form von HTML-Dateien: https://www.altem.de/
Webseite mit XB2.NET und ausschließlich dynamischem Content in Form von in-memory-HTML: https://meldungen.altem.de/
Mitglied der XUG Osnabrück
Vorsitzender des Deutschsprachige Xbase-Entwickler e. V.
- brandelh
- Foren-Moderator
- Beiträge: 15707
- Registriert: Mo, 23. Jan 2006 20:54
- Wohnort: Germersheim
- Hat sich bedankt: 71 Mal
- Danksagung erhalten: 38 Mal
- Kontaktdaten:
Re: Clipper 97 goes Xbase++ goes MDI ?
Hallo,
ich vermute mal dass der PC als solcher nicht hängt. ALT+C geht ja auch noch.
Somit schließe ich ein Hardwareproblem aus.
Ein "hängendes" Programm ist meist in einer Endlosschleife, die die Eventverarbeitung blockiert.
Zeig uns doch mal deine Event Schleife und den Code deines Eingabefeldes (also Keyboard Slot / Funktion, Plausi ...).
Nutzt du Tools ?
ich vermute mal dass der PC als solcher nicht hängt. ALT+C geht ja auch noch.
Somit schließe ich ein Hardwareproblem aus.
Ein "hängendes" Programm ist meist in einer Endlosschleife, die die Eventverarbeitung blockiert.
Zeig uns doch mal deine Event Schleife und den Code deines Eingabefeldes (also Keyboard Slot / Funktion, Plausi ...).
Nutzt du Tools ?
Gruß
Hubert
Hubert
Re: Clipper 97 goes Xbase++ goes MDI ?
Code: Alles auswählen
procedure tlsa
local malen
pzusatz=space(25)
select 3
use lager1 index lnr
select 5
set relation to lagernr into lager1
*artikelnr
fng:=0
vkpeingabe=space(10)
clear
clear gets
do uebschr with "Verkauf"
if deleted()
@1,65 say 'Markiert'
endif
malen:=chr(176)+chr(176)+chr(176)+chr(176)+chr(176)+chr(176)+chr(176)+chr(176)+chr(176)
wx:=13
wy:=35
@ wx-2,wy-2 to wx+12,wy+60 DOUBLE
if numat("#",verkauf1->artikelnr) > 0
@ wx,wy say "Produkt : "+trim(lager1->produkt)
@ wx+1,wy say "Zusatz :" get pzusatz
@ wx+2,wy say "Artikelnummer : "+verkauf1->artikelnr
@ wx+3,wy say "Einheit : "+lager1->einheit
@ wx+4,wy say "Verkaufspreis : " get vkpeingabe
@ wx+5,wy say "Menge : " get verkauf1->bm1
@ wx+8,wy say "Fl„che : " get verkauf1->f1
@ wx+8,wy+25 say " x " get verkauf1->f2
@ wx+20,wy say "Preisgruppe : " get verkauf1->vkpg
elseif verkauf1->artikelnr = "z"
@ wx,wy say "Produkt :" get verkauf1->vprodukt
@ wx+2,wy say "Artikelnummer : "+verkauf1->artikelnr
elseif verkauf1->artikelnr # "f"
@ wx,wy say "Produkt : "+trim(lager1->produkt)
@ wx+1,wy say "Produkt Zusatz : "+trim(lager1->produkt2)
@ wx+2,wy say "Artikelnummer : "+verkauf1->artikelnr
@ wx+3,wy say "Einheit : "+lager1->einheit
@ wx+4,wy say "Verkaufspreis : " get lager1->vkpreis
@ wx+6,wy say "Menge : " get verkauf1->bm1
@ wx+8,wy say "Fl„che : " get verkauf1->f1
@ wx+8,wy+25 say " x " get verkauf1->f2
@ wx+10,wy say "Preisgruppe : " get verkauf1->vkpg
else
@ wx,wy say "Produkt :" get verkauf1->vprodukt
@ wx+1,wy say "Artikelnummer : "+verkauf1->artikelnr
@ wx+3,wy say "Einheit : " get verkauf1->einheit
@ wx+4,wy say "Verkaufspreis : " get vkpeingabe
@ wx+6,wy say "Menge : " get verkauf1->bm1
@ wx+8,wy say "Fl„che : " get verkauf1->f1
@ wx+8,wy+25 say " x " get verkauf1->f2
@ wx+10,wy say "Preisgruppe : " get verkauf1->vkpg
mfg
- 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:
Re: Clipper 97 goes Xbase++ goes MDI ?
Ich vermute mal, dass "TSLA" eine Validierungsfunktion ist, die von "VEDIT" genutzt wird. Und in dieser Funktion hängt das Programm. Sehr wahrscheinlich sucht sie irgendwas ergebnislos oder läuft, wie Hubert angemerkt hat, in einer Endlosschleife. Es klemmt in Zeile 7 dieser Funktion.
Herzlich,
Tom
Tom
- brandelh
- Foren-Moderator
- Beiträge: 15707
- Registriert: Mo, 23. Jan 2006 20:54
- Wohnort: Germersheim
- Hat sich bedankt: 71 Mal
- Danksagung erhalten: 38 Mal
- Kontaktdaten:
Re: Clipper 97 goes Xbase++ goes MDI ?
Hi,
welche Zeile von TLSA ist die Zeile 7 ?
darin war das Programm als es beendet wurde ... eventuell ein RLOCK(), das auf einen schon gesperrten Datensatz wartet.
Bitte nutze in Zukunft den Code-Tag, sonst kann man den Quellcode so schwer lesen.
welche Zeile von TLSA ist die Zeile 7 ?
darin war das Programm als es beendet wurde ... eventuell ein RLOCK(), das auf einen schon gesperrten Datensatz wartet.
Bitte nutze in Zukunft den Code-Tag, sonst kann man den Quellcode so schwer lesen.
Gruß
Hubert
Hubert
- 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:
Re: Clipper 97 goes Xbase++ goes MDI ?
Zeile 7 dürfte die zweite von diesen beiden hier sein:
Wenn in Workarea 5 noch keine Datei geöffnet ist, dürfte dies die Ursache sein. Vermutlich ist die Errorsys so umgestaltet, dass bei solchen Fehlern endlos versucht wird, den Vorgang zu wiederholen.
Code: Alles auswählen
select 5
set relation to lagernr into lager1
Herzlich,
Tom
Tom
- Werner_Bayern
- Der Entwickler von "Deep Thought"
- Beiträge: 2128
- Registriert: Sa, 30. Jan 2010 22:58
- Wohnort: Niederbayern
- Hat sich bedankt: 30 Mal
- Danksagung erhalten: 75 Mal
Re: Clipper 97 goes Xbase++ goes MDI ?
Servus Klaus,
dazu gibts die Funktion AppExit(), die automatisch beim Beenden des Programmes aufgerufen wird:
Ok?
Sorry, hatte die 2. Seite nicht gesehen, die Frage wurde sicherlich schon beantwortet, es ging ums vorherige Speichern von Daten, wenn das Programm abschmiert...
dazu gibts die Funktion AppExit(), die automatisch beim Beenden des Programmes aufgerufen wird:
Code: Alles auswählen
PROCEDURE AppExit()
LOCAL bErrorHandler :=ErrorBlock( {|e| Break(e)} )
LOCAL aWS, i
/*
* Absichern der shutdown-sequence vor rekursiven Fehlern
* in DbCommit() udgl.
*/
aWS := WorkSpaceList()
FOR i:= 1 TO len(aWS)
BEGIN SEQUENCE
/*
* Erzwinge das erfolgreiche Beenden aller
* anstehenden Record updates im aktuellen
* Workspace.
*/
(aWS[i])->(DbCommit())
(aWS[i])->(DbCloseArea())
RECOVER
(aWS[i])->(DbRRollback())
(aWS[i])->(DbCloseArea())
ENDSEQUENCE
NEXT
ErrorBlock( bErrorHandler )
RETURN
Sorry, hatte die 2. Seite nicht gesehen, die Frage wurde sicherlich schon beantwortet, es ging ums vorherige Speichern von Daten, wenn das Programm abschmiert...
es grüßt
Werner
<when the music is over, turn off the lights!>
Werner
<when the music is over, turn off the lights!>