Toon posts:

[Delphi/Oracle] 3 Datetime fields probleem

Pagina: 1
Acties:

Verwijderd

Topicstarter
Ik ben een kleine module aan het bouwen waar je bezoekers in bij kan houden.
Hierbij kan je een aantal gegevens opslaan, zoals naam, kenteken, verwachtdatum, aankomstdatum en vertrekdatum.

Op het moment dat je een bezoeker invoerd kun je aangeven op welke datum (en tijd) je de bezoeker verwacht. De velden verwachtdatum en aankomstdatum blijven NULL.

De bezoekers worden weergeven in een datagrid. Je kunt hier een bezoeker selecteren en op het moment dat hij/zij arriveerd druk je op de knop Aanwezig.. Het veld aankomstdatum wordt dan geupdate met de huidige sysdate.
Hetzelfde geld voor vertrekdatum.

Wanneer een bezoeker aanwezig is geweest en weer is vertrokken (aankomst en vertrekdatum zijn beide ingevoerd), kunnen de gegevens gekopieerd worden en wordt voor verwachtdatum en aankomstdatum de huidige tijd ingevoerd. Vertrekdatum blijft null.

Nu het probleem.

Wanneer ik eerst een update doe op aankomstdatum (werkt soms). en daarna op vertrekdatum, dan blijft het vertrekdatumveld leeg. Wanneer ik alleen de vertrekdatum doe, werkt dit perfect!
Wanneer ik de de aankomst en vertrekdatum in 1 update achter elkaar uitvoer, dan blijft vertrekdatum leeg!

Ook wordt de waarde 0-0-0000 vaak opgeslagen als aankomstdatum ipv de datum/tijd.

Ik gebruik de volgende code:
Delphi:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
procedure TFrmSpo001.btnAanwezigBezoekerClick(Sender: TObject);
var
  iBTE_ID : Integer;
  sNaam, sFirmanaam, sKenteken, sVCA, sVeiligheidsfilm,
  sGastheer, sAfdeling, sFunctie, sTel, sMob, sOpmerking : String;
begin
  if ((not DMSpo001.qryBezoekers.FieldByName('AANKOMSTDATUMTIJD').IsNull) AND (not DMSpo001.qryBezoekers.FieldByName('VERTREKDATUMTIJD').IsNull)) then
  begin
  // Showmessage bezoeker bestaat al, nieuwe aanmaken?
    if messagedlg('De bezoeker: '+ DBGrdBezoekers.DataSource.DataSet['NAAM'] + ' is al aanwezig geweest. Wilt u de bezoeker nogmaals toevoegen?',
                mtConfirmation, [mbYes, mbNo], 0) = mrYes then
    begin
      dmLogin.dbDatabase.StartTransaction;
      try
        try
        // Waarden setten
          iBTE_ID := dmSpo001.qryBezoekers.FieldByName('BTE_ID').AsInteger;
          sNaam := dmSpo001.qryBezoekers.FieldByName('NAAM').AsString;
          sFirmaNaam := dmSpo001.qryBezoekers.FieldByName('FIRMANAAM').AsString;
          sKenteken := dmSpo001.qryBezoekers.FieldByName('KENTEKEN').AsString;
          sVCA := dmSpo001.qryBezoekers.FieldByName('VCA').AsString;
          sVeiligheidsfilm := dmSpo001.qryBezoekers.FieldByName('VEILIGHEIDSFILM').AsString;
          sGastheer := dmSpo001.qryBezoekers.FieldByName('GASTHEER').AsString;
          sAfdeling := dmSpo001.qryBezoekers.FieldByName('AFDELING').AsString;
          sFunctie := dmSpo001.qryBezoekers.FieldByName('FUNCTIE').AsString;
          sTel := dmSpo001.qryBezoekers.FieldByName('TEL_GASTHEER').AsString;
          sMob := dmSpo001.qryBezoekers.FieldByName('MOB_GASTHEER').AsString;
          sOpmerking := dmSpo001.qryBezoekers.FieldByName('OPMERKING').AsString;;
        // Insert
          dmSpo001.qryBezoekers.CachedUpdates := True;
          dmSpo001.qryBezoekers.Insert;
          dmSpo001.qryBezoekers.FieldByName('BTE_ID').Value := iBTE_ID;
          dmSpo001.qryBezoekers.FieldByName('NAAM').Value := sNaam;
          dmSpo001.qryBezoekers.FieldByName('FIRMANAAM').Value := sFirmanaam;
          dmSpo001.qryBezoekers.FieldByName('KENTEKEN').Value := sKenteken;
          dmSpo001.qryBezoekers.FieldByName('VCA').Value := sVCA;
          dmSpo001.qryBezoekers.FieldByName('VEILIGHEIDSFILM').Value := sVeiligheidsfilm;
          dmSpo001.qryBezoekers.FieldByName('GASTHEER').Value := sGastheer;
          dmSpo001.qryBezoekers.FieldByName('AFDELING').Value := sAfdeling;
          dmSpo001.qryBezoekers.FieldByName('FUNCTIE').Value := sFunctie;
          dmSpo001.qryBezoekers.FieldByName('TEL_GASTHEER').Value := sTel;
          dmSpo001.qryBezoekers.FieldByName('MOB_GASTHEER').Value := sMob;
          dmSpo001.qryBezoekers.FieldByName('VERWACHTDATUMTIJD').AsDateTime := Now;
          dmSpo001.qryBezoekers.FieldByName('AANKOMSTDATUMTIJD').AsDateTime := Now;
          dmSpo001.qryBezoekers.FieldByName('OPMERKING').Value := sOpmerking;
          dmSpo001.qryBezoekers.ApplyUpdates;
          dmLogin.dbDatabase.Commit;
        except
          dmLogin.dbDatabase.Rollback;
          raise;
        end;
      finally
        dmSpo001.qryBezoekers.CommitUpdates;
        dmSpo001.qryBezoekers.CachedUpdates := False;
        dmSpo001.qryBezoekers.Active := False;
        dmSpo001.qryBezoekers.Active := True;
//        dmSpo001.qryBezoekers.Locate('BKR_ID', iID, []);
        DBGrdBezoekers.Focused;
        btnAfwezigBezoeker.Enabled := True;
      end;
    end;
  end
  else if not DMSpo001.qryBezoekers.FieldByName('AANKOMSTDATUMTIJD').IsNull then
  begin
  // Showmessage bezoeker is al aanwezig. Aanwezigtijd wijzigen?
    if messagedlg('De bezoeker: '+ DBGrdBezoekers.DataSource.DataSet['NAAM'] + ' is al aanwezig. Wilt u de aankomstdatum en tijd toch wijzigen?',
                mtConfirmation, [mbYes, mbNo], 0) = mrYes then
    begin
      prWijzigDatum('BEZOEKERS', 'AANKOMSTDATUMTIJD');
      DBGrdBezoekers.Focused;
      btnAfwezigBezoeker.Enabled := True;
    end;
  end
  else
  begin
    prWijzigDatum('BEZOEKERS', 'AANKOMSTDATUMTIJD');
    DBGrdBezoekers.Focused;
    btnAfwezigBezoeker.Enabled := True;
  end;
end;

///-----------------------------------------------------------------------------------

procedure TFrmSpo001.prWijzigDatum(_sType, _sDatum : String);
var
  tTempQuery : TQuery;
  sID : String;
begin
  dmLogin.dbDatabase.StartTransaction;
  try
    try
      if(_sType = 'BEZOEKERS')then
      begin
        tTempQuery := DMSpo001.qryBezoekers;
        sID := 'BKR_ID';
      end
      else if(_sType = 'LEVERANCIERS')then
      begin
        tTempQuery := DMSpo001.qryLeveranciers;
        sID := 'LVR_ID';
      end
      else
      begin
        application.messagebox('Het type bestaat niet.',
                           'Fout...',
                           MB_OK + MB_ICONWARNING);
        exit;
      end;

      tTempQuery.CachedUpdates := True;
      tTempQuery.Edit;
      iID := tTempQuery.FieldByName(sID).AsInteger;
      tTempQuery.FieldByName(_sDatum).AsDateTime := Now;
      tTempQuery.ApplyUpdates;
      dmLogin.dbDatabase.Commit;
    except
      dmLogin.dbDatabase.Rollback;
      raise;
    end;
  finally
    tTempQuery.CommitUpdates;
    tTempQuery.CachedUpdates := False;
    tTempQuery.Active := False;
    tTempQuery.Active := True;
    tTempQuery.Locate(sID, iID, []);
  end;
end;


Daarnaast krijg ik ook vaak de melding:
Could nog convert variant of type(null) into type(double)
Terwijl ik nergens een null waarde probeer te converteren oid..

  • whoami
  • Registratie: December 2000
  • Laatst online: 23:03
Met welke versie van Delphi werk je ?

* whoami ziet cached updates en denkt iew....

* whoami ziet ook dat je gegevens probeert te inserten dmv de AddNew methods etc...

Waarom maak je niet gewoon gebruik van een goold old INSERT SQL query ?

https://fgheysels.github.io/


Verwijderd

Topicstarter
Gebruik Delphi 7
Oracal 8i

Deze methode werd al gebruikt in dit programma (ben bezig met uitbreidingen/verbeteringen). Maar dan ook zonder transactions/commit, etc.

Ik gebruik een Tquery, en updatesql met een insert.
Heb er ook nog geen 1x problemen mee gehad. Alleen nu ik 3 datetime velden gebruik geeft hij problemen.

Verwijderd

Topicstarter
Ok,

heb nog een beetje zitten debuggen en testen.
Het blijkt dat ie naar de cachedupdates := False alles weer weggooid. (Of ja alles.. ALLEEN het veld VERTREKDATUMTIJD wordt leeg gegooid. De rest blijft gevuld!)
Terwijl ik een commit heb gedaan.

Delphi:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
procedure TFrmSpo001.prWijzigDatum(_sType, _sDatum : String); 
var 
  tTempQuery : TQuery; 
  sID : String; 
begin 
  dmLogin.dbDatabase.StartTransaction; 
  try 
    try 
      if(_sType = 'BEZOEKERS')then 
      begin 
        tTempQuery := DMSpo001.qryBezoekers; 
        sID := 'BKR_ID'; 
      end 
      else if(_sType = 'LEVERANCIERS')then 
      begin 
        tTempQuery := DMSpo001.qryLeveranciers; 
        sID := 'LVR_ID'; 
      end 
      else 
      begin 
        application.messagebox('Het type bestaat niet.', 
                           'Fout...', 
                           MB_OK + MB_ICONWARNING); 
        exit; 
      end; 

      tTempQuery.CachedUpdates := True; 
      tTempQuery.Edit; 
      iID := tTempQuery.FieldByName(sID).AsInteger; 
      tTempQuery.FieldByName(_sDatum).AsDateTime := Now; 
      tTempQuery.ApplyUpdates; 
      dmLogin.dbDatabase.Commit; 
    except 
      dmLogin.dbDatabase.Rollback; 
      raise; 
    end; 
  finally 
    tTempQuery.CommitUpdates; 
// -> Query is opgeslagen
    tTempQuery.CachedUpdates := False; 
// -> Query is weer leeg
    tTempQuery.Active := False; 
    tTempQuery.Active := True; 
    tTempQuery.Locate(sID, iID, []); 
  end; 
end;


waar kan dit aan liggen? En hoe kan ik het eventueel anders doen?
Ik heb dit nog niet eerder gezien..

[ Voor 10% gewijzigd door Verwijderd op 21-10-2005 11:13 ]