Clipper 97 goes Xbase++ goes MDI ?

Auf dem Weg von Clipper, FoxPro u.ä. nach Xbase++

Moderator: Moderatoren

Benutzeravatar
Tom
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 9345
Registriert: Do, 22. Sep 2005 23:11
Wohnort: Berlin
Hat sich bedankt: 100 Mal
Danksagung erhalten: 359 Mal
Kontaktdaten:

Re: Clipper 97 goes Xbase++ goes MDI ?

Beitrag von Tom »

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. :wink: 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
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15688
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Re: Clipper 97 goes Xbase++ goes MDI ?

Beitrag von brandelh »

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().
Gruß
Hubert
Benutzeravatar
Tom
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 9345
Registriert: Do, 22. Sep 2005 23:11
Wohnort: Berlin
Hat sich bedankt: 100 Mal
Danksagung erhalten: 359 Mal
Kontaktdaten:

Re: Clipper 97 goes Xbase++ goes MDI ?

Beitrag von Tom »

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.
Herzlich,
Tom
Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 12903
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 19 Mal
Danksagung erhalten: 44 Mal

Re: Clipper 97 goes Xbase++ goes MDI ?

Beitrag von AUGE_OHR »

hi,

Code: Alles auswählen

// klappt nicht ?
::nCounter := KUNDEN->IDNO
KUNDEN->IDNO := ::nCounter++

// funktioniert
REPLACE KUNDEN->IDNO WITH KUNDEN->IDNO+1
::nCounter := KUNDEN->IDNO
beides "müsste" doch den "Zähler" erhöhen ... warum klappt bei mir Variante 1 nicht :-k
gruss by OHR
Jimmy
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15688
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Re: Clipper 97 goes Xbase++ goes MDI ?

Beitrag von brandelh »

Hallo Jimmy,

weil ein nVar++ erst NACH der Zuweisung ausgeführt wird. nVar+1 hingegen oder ++nVar wird zuerst berechnet und dann zugewiesen.
Gruß
Hubert
Benutzeravatar
Martin Altmann
Foren-Administrator
Foren-Administrator
Beiträge: 16502
Registriert: Fr, 23. Sep 2005 4:58
Wohnort: Berlin
Hat sich bedankt: 111 Mal
Danksagung erhalten: 48 Mal
Kontaktdaten:

Re: Clipper 97 goes Xbase++ goes MDI ?

Beitrag von Martin Altmann »

Geht denn eigentlich ein

Code: Alles auswählen

KUNDEN->IDNO++
Ich denke mal, eher nicht - oder?
Wäre ja doch ein speziellerer Einzelfall...

Viele Grüße,
Martin
:grommit:
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.
Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 12903
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 19 Mal
Danksagung erhalten: 44 Mal

Re: Clipper 97 goes Xbase++ goes MDI ?

Beitrag von AUGE_OHR »

brandelh hat geschrieben:weil ein nVar++ erst NACH der Zuweisung ausgeführt wird. nVar+1 hingegen oder ++nVar wird zuerst berechnet und dann zugewiesen.
STIMMT !!! ... blame on me
Martin hat geschrieben:KUNDEN->IDNO++
hm ... ich wollte das ++ beim 2nd Beispiel vermeiden (was ja der Fehler war)
gruss by OHR
Jimmy
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15688
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Re: Clipper 97 goes Xbase++ goes MDI ?

Beitrag von brandelh »

Martin Altmann hat geschrieben:Geht denn eigentlich ein

Code: Alles auswählen

KUNDEN->IDNO++
Ich denke mal, eher nicht - oder?
Wäre ja doch ein speziellerer Einzelfall...

Viele Grüße,
Martin

Code: Alles auswählen

KUNDEN->IDNO++
würde auf jeden Fall den aktuellen Wert zurückgeben, ob aber danach ein automatisches Replace mit dem um 1 erhöhten Wert stattfindet :?
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
Benutzeravatar
Martin Altmann
Foren-Administrator
Foren-Administrator
Beiträge: 16502
Registriert: Fr, 23. Sep 2005 4:58
Wohnort: Berlin
Hat sich bedankt: 111 Mal
Danksagung erhalten: 48 Mal
Kontaktdaten:

Re: Clipper 97 goes Xbase++ goes MDI ?

Beitrag von Martin Altmann »

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
:grommit:
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.
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15688
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Re: Clipper 97 goes Xbase++ goes MDI ?

Beitrag von brandelh »

Martin Altmann hat geschrieben:Ich denke mal, das klappt in dem Fall nicht wirklich.
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.
Aber ich mach das nicht, denn der Quellcode ist mir zu unleserlich :D
Gruß
Hubert
Benutzeravatar
Markus Walter
Programmier-Gott
Programmier-Gott
Beiträge: 1018
Registriert: Di, 24. Jan 2006 10:22
Wohnort: Saarland

Re: Clipper 97 goes Xbase++ goes MDI ?

Beitrag von Markus Walter »

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
Hallo 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
KlausXXL
Rookie
Rookie
Beiträge: 12
Registriert: Di, 05. Jan 2010 11:27

Re: Clipper 97 goes Xbase++ goes MDI ?

Beitrag von KlausXXL »

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]=Zurck [F2]=... [F3]=... "
@ 41,1 SAY "[F1]=šbersicht [F4]=Anfgen [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
Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 12903
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 19 Mal
Danksagung erhalten: 44 Mal

Re: Clipper 97 goes Xbase++ goes MDI ?

Beitrag von AUGE_OHR »

KlausXXL 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 --
klar hast du, nur du weist es noch nicht :)

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
KlausXXL hat geschrieben:und wie gesagt hätte ich auch express++ noch zur Verfügung !
kann ich leider nicht mir dienen, aber es gibt ja andere User die helfen können
KlausXXL 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
im VIO / Hybrid Mode hab ich mich sehr schwer getan, aber im GUI Mode kein Problem
KlausXXL hat geschrieben:2. wie sieht der Code aus wenn ich DBEDIT durch TBROWSE ersetzen will -- ist Tbrowse schneller ?
wie schon gesagt, sie dir den Source an.
Tbrowse ist deutlich "mächtiger" und die Art und Weise gleicht XbpBrowse()
KlausXXL hat geschrieben:3. geht es auch wenn ich express++ verwende --- was muß ich da ändern ?
vermutlich nur wenig ...

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
Juergen
UDF-Programmierer
UDF-Programmierer
Beiträge: 92
Registriert: Di, 19. Dez 2006 19:37
Wohnort: Düsseldorf
Kontaktdaten:

Re: Clipper 97 goes Xbase++ goes MDI ?

Beitrag von Juergen »

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
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15688
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Re: Clipper 97 goes Xbase++ goes MDI ?

Beitrag von brandelh »

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 ...
Gruß
Hubert
KlausXXL
Rookie
Rookie
Beiträge: 12
Registriert: Di, 05. Jan 2010 11:27

Re: Clipper 97 goes Xbase++ goes MDI ?

Beitrag von KlausXXL »

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
Benutzeravatar
Martin Altmann
Foren-Administrator
Foren-Administrator
Beiträge: 16502
Registriert: Fr, 23. Sep 2005 4:58
Wohnort: Berlin
Hat sich bedankt: 111 Mal
Danksagung erhalten: 48 Mal
Kontaktdaten:

Re: Clipper 97 goes Xbase++ goes MDI ?

Beitrag von Martin Altmann »

Was ist TLSA?

Viele Grüße,
Martin
:grommit:
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.
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15688
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Re: Clipper 97 goes Xbase++ goes MDI ?

Beitrag von brandelh »

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 ?
Gruß
Hubert
KlausXXL
Rookie
Rookie
Beiträge: 12
Registriert: Di, 05. Jan 2010 11:27

Re: Clipper 97 goes Xbase++ goes MDI ?

Beitrag von KlausXXL »

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
Benutzeravatar
Tom
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 9345
Registriert: Do, 22. Sep 2005 23:11
Wohnort: Berlin
Hat sich bedankt: 100 Mal
Danksagung erhalten: 359 Mal
Kontaktdaten:

Re: Clipper 97 goes Xbase++ goes MDI ?

Beitrag von Tom »

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
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15688
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Re: Clipper 97 goes Xbase++ goes MDI ?

Beitrag von brandelh »

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.
Gruß
Hubert
Benutzeravatar
Tom
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 9345
Registriert: Do, 22. Sep 2005 23:11
Wohnort: Berlin
Hat sich bedankt: 100 Mal
Danksagung erhalten: 359 Mal
Kontaktdaten:

Re: Clipper 97 goes Xbase++ goes MDI ?

Beitrag von Tom »

Zeile 7 dürfte die zweite von diesen beiden hier sein:

Code: Alles auswählen

select 5
set relation to lagernr into lager1
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.
Herzlich,
Tom
Benutzeravatar
Werner_Bayern
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2120
Registriert: Sa, 30. Jan 2010 22:58
Wohnort: Niederbayern
Hat sich bedankt: 29 Mal
Danksagung erhalten: 70 Mal

Re: Clipper 97 goes Xbase++ goes MDI ?

Beitrag von Werner_Bayern »

Servus Klaus,

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
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...
es grüßt

Werner

<when the music is over, turn off the lights!>
Antworten