errorsys

Alle Fragen um die Programmierung, die sich sonst nicht kategorisieren lassen. Von Makro bis Codeblock, von IF bis ENDIF

Moderator: Moderatoren

Benutzeravatar
Manfred
Foren-Administrator
Foren-Administrator
Beiträge: 21165
Registriert: Di, 29. Nov 2005 16:58
Wohnort: Kreis Wesel
Hat sich bedankt: 206 Mal
Danksagung erhalten: 67 Mal

errorsys

Beitrag von Manfred »

Hi,

ich hatte gerade die Fehlermeldung, dass die Länge des Datenbankfeldes überschritten wurde bei der Speicherung. Schön und Gut, aber das System hat mir nicht gesagt, welche Datenbank, bzw. was noch viel wichtiger wäre, in welchem Feld es passiert ist. Nachdem ich die Fehlermeldung im Debugger angesehen hatte, konnte ich nur feststellen über ALIAS() welche Db es wäre. Hat jemand irgendeine Idee, wie ich das Feld auch ermitteln kann?
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!!
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:

Beitrag von Tom »

Hallo, Manfred.

Die :args- und die :operation-Instanzen des Error-Objekts (wie sieht Dein Errorsys aus?) sollten Dir die entsprechenden Informationen liefern, und zusätzlich könntest Du an der entsprechenden Stelle natürlich auch Debug-Code einsetzen, Dir also einfach das jeweils aktualisierte Datenbankfeld anzeigen lassen.
Herzlich,
Tom
Benutzeravatar
Manfred
Foren-Administrator
Foren-Administrator
Beiträge: 21165
Registriert: Di, 29. Nov 2005 16:58
Wohnort: Kreis Wesel
Hat sich bedankt: 206 Mal
Danksagung erhalten: 67 Mal

Beitrag von Manfred »

Hi Tom,
Tom hat geschrieben:Hallo, Manfred.

Die :args- und die :operation-Instanzen des Error-Objekts (wie sieht Dein Errorsys aus?) sollten Dir die entsprechenden Informationen liefern, und zusätzlich könntest Du an der entsprechenden Stelle natürlich auch Debug-Code einsetzen, Dir also einfach das jeweils aktualisierte Datenbankfeld anzeigen lassen.
:args zeigt ein recht großes Array an, in dem die ganzen Objektvariablen stehen, also dort steht zumindest nicht drin, welches Feld den Fehler verursacht.

In :operation steht nur das Pogramm innerhalb dessen der Fehler generiert wurde. Das hatte ich alles schon druchgesehen.
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!!
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:

Beitrag von Martin Altmann »

Hallo Manfred,
dann musst Du halt die einzelnen Arrayelemente mit den ihnen entsprechenden Feldern abgleichen!

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
Manfred
Foren-Administrator
Foren-Administrator
Beiträge: 21165
Registriert: Di, 29. Nov 2005 16:58
Wohnort: Kreis Wesel
Hat sich bedankt: 206 Mal
Danksagung erhalten: 67 Mal

Beitrag von Manfred »

Hi Martin,

sorry, haste mal ne Leiter? Das ist mir jetzt zu hoch.

Abgleichen? Wie stellst Du Dir das vor? Nachsehen, was in den Vars steht und dann mit dem Datensatzfeld vergleichen?
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!!
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:

Beitrag von Martin Altmann »

Genau so!
In Deinem Array hast Du ja die Felder in einer bestimmten Reihenfolge drin - schau also, welches Feld an welcher Stelle ist.
Vergleiche den Aufbau der einzelnen Feldinhalte mit dem Aufbau der einzelnen Arrayelemente und beachte dabei auch die jeweiligen Längen!

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: errorsys

Beitrag von AUGE_OHR »

hi,
Manfred hat geschrieben: Hat jemand irgendeine Idee, wie ich das Feld auch ermitteln kann?
leider nicht so richtig ... ausser in die DBF sehen wo was fehlt :)

aber nun mal Ernst : ich habe paar Erweiterrungen in meiner Errorsys
die mir ganz nützlich erscheinen.

gruss by OHR
Jimmy

Code: Alles auswählen

*** snip ***
...
  ? Replicate( "-", 78 )
   ? EHS_ERROR_LOG_OF +ID_USER+" Ver."+ID_VERSION+' "'+ appName(.f.) +'"'+ EHS_DATE, Date(), Time()
   ?
   ? EHS_XPP_VERSION , Version()+"."+Version(3)
   ? EHS_OS_VERSION  , Os()
   ? "Memory (RAM_AVAIL)  :" , LTRIM(STR(MEMORY(MEM_RAM_AVAIL)/1000))+" of "+LTRIM(STR(Memory(MEM_RAM_TOTAL)/1000))+ " MB"
   ? "DiskSpace C:        :" , LTRIM(STR(DiskSpace("C:")/1000000))+" KB"
   ? "Alias()             :" , IF(USED(),ALIAS(),"leer")
   ? "Recno()             :" , IF(USED(),LTRIM(STR(RECNO())),"leer")
   ? "Found()             :" , IF(Found(),"YES","NO")
   ? "Select()            :" , LTRIM(STR(SELECT()))
   ? "IndexOrd()          :" , LTRIM(STR(OrdNumber()))
IF OrdNumber() > 0
   ? "Indexfocus()        :" , OrdSetFocus()
   ? "Indexname()         :" , OrdName()
   ? "Indexkey()          :" , OrdKey()
ENDIF
IF USED()
   ? "DBO_ALIAS           :" , DbInfo( DBO_ALIAS     )
   ? "DBO_FILENAME        :" , DbInfo( DBO_FILENAME  )
   ? "DBO_ORDERS          :" , LTRIM(STR(DbInfo( DBO_ORDERS    )))
   ? "DBO_RELATIONS       :" , LTRIM(STR(DbInfo( DBO_RELATIONS )))
   ? "DBO_SHARED          :" , IF(DbInfo( DBO_SHARED    ),"YES","NO")
   ? "DBO_REMOTE          :" , IF(DbInfo( DBO_REMOTE    ),"YES","NO")
   ? "DBO_SERVER          :" , IF(DbInfo( DBO_SERVER    ),"YES","NO")
   ? "DBO_DBENAME         :" , DbInfo( DBO_DBENAME   )
ENDIF

   aWSL := WorkSpaceList()
   nWSL := LEN(aWSL)
   ? "WorkSpaceList       :" , ""
   FOR j = 1 TO nWSL
      ?? aWSL[j]
      IF j = nWSL
      ELSE
         ?? ", "
      ENDIF
   NEXT
   ? ""

   ? Replicate( "-", 78 )
   ? "oError:args         :"
...
*** eof ***
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15689
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Beitrag von brandelh »

Hallo Manfred,

also ich meine man müßte die Fehlerzeile (REPLACE ...) im Callstack unten sehen, das müsste die letzte vor der ERRORSYS sein.

Auch kann es eigentlich nur ein numerisches Feld sein, dessen Vorkommastellen nicht für den Wert reichen, denn Datum, logisch, String und Memo, schneiden automatisch ab.
Gruß
Hubert
Benutzeravatar
Manfred
Foren-Administrator
Foren-Administrator
Beiträge: 21165
Registriert: Di, 29. Nov 2005 16:58
Wohnort: Kreis Wesel
Hat sich bedankt: 206 Mal
Danksagung erhalten: 67 Mal

Beitrag von Manfred »

Hi Hubert,

Replace benutze ich überhaupt nicht mehr. Ich mache es mit :=
Außerdem benutze ich Deinen herrlichen Vorschlag über Codeblocks usw. Du erinnerst Dich? Leider wird das alles über Aeval ausgewertet und somit kann man nicht mehr sehen, wenn die Felder ausgetauscht werden.

Aber der Vorschlag von Jimmy bringt mich schon ein Stück weiter (mal wieder gepennt, war wohl zu einfach für mich :roll: ) Ich habe meine Errorsys erweitert und jetzt sehe ich zumindest welche Datenbank und welche Recno es war.

Ich habe aber an den Alaska Support angemailt. Mal sehen was die so vorschlagen. Ist ja eigentlich nicht uninteressant diese Frage, mit dem Problem. Was nutzt mir eine Fehlermeldeung, wenn ich nicht weiß wo sie genau herkommt?
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!!
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15689
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Beitrag von brandelh »

Hallo Manfred,

woher sie kommt ist eindeutig, wie geschrieben ist einer deiner zu schreibenden Werte im Vorkommabereich länger als deine Felddefinition.
Clipper hat früher glaube ich **** ins Feld geschrieben, ich meine Xbase++ schreibt 0 ... Untersuche den Eingabedatenbestand und die Feldlänge.

Um das abzufangen kannst du im Codeblock bei numerischen Feldern die Länge und Dezimalstellen abfragen und z.B. mit str(nWert,nLen,nDec) testen ob da **** im String enthalten sind -> Feldlängenfehler !
Gruß
Hubert
Benutzeravatar
Manfred
Foren-Administrator
Foren-Administrator
Beiträge: 21165
Registriert: Di, 29. Nov 2005 16:58
Wohnort: Kreis Wesel
Hat sich bedankt: 206 Mal
Danksagung erhalten: 67 Mal

Beitrag von Manfred »

Hallo Hubert,

es passiert ja nicht bei der Eingabe, sondern bei Datenübernahmen aus fremden Tabellen, von denen ich zwar weiß, welches Feld erwartet wird, aber nicht immer die Länge der Felder klar ist. Das sind alles Textfelder, die dann entsprechend in numerische umgewandelt werden. Es wird aus Textdateien gelesen und da kann es halt vorkommen, das irgendwann einmal mehr drinsteht, als ich vorbereitet habe. Naja, irgendwann ist halt immer das 1.Mal.

Aber an dieser Stelle müßte ich wirklich einmal vorher versuchen zu prüfen, ob die Inhalte auch in die Felder passen. Das muß aber dann vorher schon passieren, wenn die Daten in die Membervar geschrieben werden.
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!!
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15689
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Beitrag von brandelh »

Hallo Manfred,

oder du nimmst gleich das Maximum ... was auch nicht immer hilft ;-)
Gruß
Hubert
Benutzeravatar
Manfred
Foren-Administrator
Foren-Administrator
Beiträge: 21165
Registriert: Di, 29. Nov 2005 16:58
Wohnort: Kreis Wesel
Hat sich bedankt: 206 Mal
Danksagung erhalten: 67 Mal

Beitrag von Manfred »

Hi Hubert,

das wäre natürlich eine Lösung, aber wie sehen denn Maximumfelder in einem Browse aus? Außerdem kostet das doch Speicherplatz, oder, auch wenn der in Mengen heutzutage zur Verfügung steht. Was aber nicht einreißen sollte.....
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!!
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15689
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Beitrag von brandelh »

Manfred hat geschrieben:aber wie sehen denn Maximumfelder in einem Browse aus?
Man könnte die Spaltenbreite dynamisch machen ...
Feld "N",18,2 -> Anzeige im Browse 9,2 bis * auftauchen, dann Anzeigewert erhöhen ...
Du könntest natürlich auch den größten Wert ermitteln und die dafür nötige Anzahl berechnen, bevor du deinen browse erzeugst, aber das wird eventuell zu langsam.
Gruß
Hubert
Benutzeravatar
Koverhage
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2470
Registriert: Fr, 23. Dez 2005 8:00
Wohnort: Aalen
Hat sich bedankt: 102 Mal
Danksagung erhalten: 3 Mal
Kontaktdaten:

Beitrag von Koverhage »

Eigentlich steht doch in der Errorlog in welcher Zeile der Fehler auftritt.

db->value := input_wert

Ich mache das in den meisten Fällen so, das ich die Anzahl der zu übernehmenden Stellen mit der Feldlänge vergleiche.

Dies ist eine Abfrage mehr und verhindert solche Fehlermeldungen.
Manche Anwender übergehen die Fehlermeldung und dann steht 0 drin.

Also so ähnlich wie
if len(input_wert) > len(fielsize)
then print error
else
übernehme den Wert
endif
Benutzeravatar
Manfred
Foren-Administrator
Foren-Administrator
Beiträge: 21165
Registriert: Di, 29. Nov 2005 16:58
Wohnort: Kreis Wesel
Hat sich bedankt: 206 Mal
Danksagung erhalten: 67 Mal

Beitrag von Manfred »

Hi,

ich habe mir alles zu Herzen genommen und folgendes gebaut:

schnipp----------------

Code: Alles auswählen

          FOR nI := 1 TO nFcount                                                // Durchlauf der einzelnen Felder der DB
              cField := FIELDNAME(nI)
              FeldWert := Fieldget(nI)
              IF VALTYPE(FeldWert) = "N"                                        // hier können die meissten Fehler auftauchen
                 nFeldLaenge := Fieldinfo(nI,FLD_LEN) - Fieldinfo(nI,FLD_DEC)
                 IF Fieldinfo(nI,FLD_DEC) > 0
                    nFeldLaenge := --nFeldLaenge                                // Komma muß weg
                 ENDIF
                 IF nFeldLaenge < MAXLINE(ALLTRIM(STR(objekt:&cField)))
// Reaktion
                 ENDIF
              ENDIF
              cArbeit := "{|objekt| (ALIAS())->"+cField+" := objekt:"+cField+"}"
              bArbeit := &(cArbeit)
              AADD(aKopieren, bArbeit)
          NEXT
          AEVAL( aKopieren,{ |b| EVAL( b, objekt ) } )
Findet das Zustimmung bei euch, oder eher Augenrollen und Katastrophenalarm?
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!!
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15689
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Beitrag von brandelh »

Manfred hat geschrieben: nFeldLaenge := --nFeldLaenge // Komma muß weg
Das ist kürzer ...

nFeldLaenge--
Gruß
Hubert
Benutzeravatar
Manfred
Foren-Administrator
Foren-Administrator
Beiträge: 21165
Registriert: Di, 29. Nov 2005 16:58
Wohnort: Kreis Wesel
Hat sich bedankt: 206 Mal
Danksagung erhalten: 67 Mal

Beitrag von Manfred »

Hi Hubert,

stimmt vollkommen, mal wieder gepennt. Aber die Sache mit dem Komma mußte auch raus, weil das Teil sich bei 0.0 in ein 0 Feld auch beschwert hatte. Aber wir wissen ja: 0x0 is 0 is 0
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!!
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15689
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Beitrag von brandelh »

Hallo Manfred,

am einfachsten ist du holst die nLen und nDec und rufst str(..., nLen,nDec) auf, wenn im Rückgabewert **** enthalten sind, liegt ein Fehler vor !
Einfacher und genauer geht es nicht.
Gruß
Hubert
Benutzeravatar
Manfred
Foren-Administrator
Foren-Administrator
Beiträge: 21165
Registriert: Di, 29. Nov 2005 16:58
Wohnort: Kreis Wesel
Hat sich bedankt: 206 Mal
Danksagung erhalten: 67 Mal

Beitrag von Manfred »

Hi Hubert,

verstehe ich nicht. Das es nicht paßt, wird doch erst gemerkt, wenn es versucht wird ins Feld zu schreiben.....
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!!
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15689
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Beitrag von brandelh »

Hallo Manfred,

in deinem Code hast du unterschieden ob es ein numerisches Feld ist oder nicht, und die Länge berechnet, statt dieser Berechnung würde diese Abfrage sicher prüfen was raus kommt.

Code: Alles auswählen

nLen  := Länge insgesamt aus Feldinfo
nDez  := Anzahl Dezimalstellen
nWert := Wert des Feldinhaltes
if "*" $ str(nWert,nDez,nLen)
   Fehlermeldung -> Länge wird überschritten 
else
   Feld := nWert ...
endif
Das ganze jetzt ohne Handbuch, daher im Pseudocode ...
Gruß
Hubert
Benutzeravatar
Manfred
Foren-Administrator
Foren-Administrator
Beiträge: 21165
Registriert: Di, 29. Nov 2005 16:58
Wohnort: Kreis Wesel
Hat sich bedankt: 206 Mal
Danksagung erhalten: 67 Mal

Beitrag von Manfred »

Hi Hubert,

alles klar, aber es werden keine "*" geschrieben. Die Fehlermeldung kommt und es wird eine 0 ins Feld geschrieben, wenn überhaupt, da ja numerische Felder mit 0 vorinitialisiert sind.
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!!
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15689
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Beitrag von brandelh »

Hallo Manfred,

genau deshalb sollst du ja nicht direkt ins Feld zuweisen, sondern bei numerischen Feldern erst den Rückgabewert von str() prüfen. Bei der Zuweisung gibt es sofort eine Fehlermeldung, das Feld bleibt auf 0, bei STR() würdest du ein * abfragen können und könntest darauf reagieren ...
Gruß
Hubert
Benutzeravatar
Manfred
Foren-Administrator
Foren-Administrator
Beiträge: 21165
Registriert: Di, 29. Nov 2005 16:58
Wohnort: Kreis Wesel
Hat sich bedankt: 206 Mal
Danksagung erhalten: 67 Mal

Beitrag von Manfred »

Hi Hubert,

ich habe mal wieder ein Brett vor dem Kopf. Wie soll das klappen? Nicht ins Feld schreiben? Vorher prüfen?

Ich kann Dir nicht folgen, wie Du das gedacht hast.
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!!
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15689
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Beitrag von brandelh »

Hallo Manfred,

statt deinem Code

Code: Alles auswählen

FOR nI := 1 TO nFcount           // Durchlauf der einzelnen Felder der DB 
       cField := FIELDNAME(nI) 
       FeldWert := Fieldget(nI) 
       IF VALTYPE(FeldWert) = "N"  // hier können die meissten Fehler auftauchen 
           nFeldLaenge := Fieldinfo(nI,FLD_LEN) - Fieldinfo(nI,FLD_DEC) 
           IF Fieldinfo(nI,FLD_DEC) > 0 
               nFeldLaenge := --nFeldLaenge  // Komma muß weg 
           ENDIF 
           IF nFeldLaenge < MAXLINE(ALLTRIM(STR(objekt:&cField))) 
               // Reaktion 
           ENDIF 
       ENDIF 
       cArbeit := "{|objekt| (ALIAS())->"+cField+" := objekt:"+cField+"}" 
       bArbeit := &(cArbeit) 
       AADD(aKopieren, bArbeit) 
NEXT 
AEVAL( aKopieren,{ |b| EVAL( b, objekt ) } ) 
Nun kommt es darauf an,
1. die Fehlersituation zu erkennen,
2. eine ERRORSYS Fehlermeldung zu verhindern
3. eine eigene Fehlermeldung auszugeben ...
das könnte so gehen (die Texte sind jetzt nicht ernst gemeint ;-) )

Code: Alles auswählen

::FehlerText := ""      // diese iVar merkt sich die Fehler
IsFehler := .f.         // diese lokale Variable merkt sich ob im aktuellen Feld ein Fehler ist

FOR nI := 1 TO nFcount           // Durchlauf der einzelnen Felder der DB 
    cField := FIELDNAME(nI) 
    FeldWert := Fieldget(nI) 
    IsFehler := .f.                 // Grundsatz kein Fehler 
    IF VALTYPE(FeldWert) = "N"  // NUR HIER können Fehler auftauchen 
       nLen := Fieldinfo(nI,FLD_LEN)
       nDec := Fieldinfo(nI,FLD_DEC) 
       if "*" $ str(FeldWert,nLen,nDec)
          IsFehler := .t.
          ::FehlerText += "Feldlängenfehler: "+cField+"bei Recno...."+CRLF
       endif
    ENDIF 
    if ! IsFehler // nur wenn kein Fehler auftaucht
       cArbeit := "{|objekt| (ALIAS())->"+cField+" := objekt:"+cField+"}" 
       bArbeit := &(cArbeit) 
       AADD(aKopieren, bArbeit) 
    endif
NEXT 
AEVAL( aKopieren,{ |b| EVAL( b, objekt ) } ) 
...
if len(::FehlerText)>0
   msgbox(::FehlerText,"Du Depp hast die Feldlänge falsch definiert")
endif
Gruß
Hubert
Antworten