Buon pranzo se avete ancora questa brutta abitudine :D
Mi sto picchiando con qualcosa che reputo banale ma che non mi funziona.
Le mie precedenti esperienze con i db risalgono soprattutto ai tempi di VB6 ed usavo principalmente MSSql come engine. Lavoravo principamente da codice senza componenti "bandati". Ho lavoarto anche con Delphi ( alla versione 6) ma per un progetto in cui fornivo accesso a VB tramite dll a FlexCompress di ComponentAce. Bell'oggetto.
Ora, per un piccolo progetto di interfaccia a centralino via seriale, sto usando Lazarus.
MI piace molto l'ambiente, veramente notevole.
Sempre per la prima volta, sto usando sqlite come db.
Ho esigenze veramente minimali, avrei potuto risolvere anche con un file tipo ini per persistere le configurazioni del centralino. Mi piace però l'idea di sperimentare le cose che non conosco e cosi...
Dopo lo sproloquio vengo al punto.
1 oggetto TZConnection ( impostazioni da codice), no designtme, autocommit false.
2 oggetti TzTable con le stesse proprietà riguardo a cache ect.
Nella seconda tabella ho un errore 'library routine called out of sequence' nel tentativo di inserire più di 1 record.
Cercando in giro sembra che il problema, negli altri casi, sia dovuto a impostazione errate della connessione. Nel mio caso direi di no perché la prima tabella lavora normalmente, ma esegue sempre e solo inserimento di 1 record alla volta.
Il codice riportato sotto dovrebbe essere eseguito 10 volte. Il primo inserimento funziona, al secondo becco l'eccezione.
procedure TfrmMain.CreateConfig(chnList: HBChanList; confNum: Integer);
var
i: Integer;
s: String;
begin
with tblConfigurazioni do begin
if not Active then Open;
Insert;
FieldByName('CodImpianto').Value := txtCode.Text;
FieldByName('NumMemoria').Value := confNum;
FieldByName('DataCreazione').Value := Now;
for i := Low(chnList) to High(chnList) do begin
if i < 9 then s := '0' + IntToStr(i + 1) else s := IntToStr(i + 1);
FieldByName('Can_' + s).Value := chnList[i];
end;
ApplyUpdates;
//CommitUpdates;
end;
end;
Credo che il problema sia da inputare all'uso errato che di ApplyUpdates ed Insert.
Qual'è il modo corretto di chiamare questi metodi, ovvero in quale sequenza?
Grazie e buona domenica.
Carlo
Stamani, a mente fresca, ho voluto rileggere con più attenzione le note di sqlite sui suoi datatypes.
Dopo di che ho modificato la definizione del campo CodImpianto da String 20 a Text.
Ora in inserimento non genera più eccezione floating point overflow.
In lettura però, attribuendo il valore letto a una label, vedo a video la scritta 'memo' ( apici messi per chiarezza ).
Leggo il valore con questo codice:
lblCode.Caption := tblImpianti.FieldByName('CodImpianto').Text
Per correggere questo aspetto ho modificato nel modo seguente:
lblCode.Caption := String(tblImpianti.FieldByName('CodImpianto').Value);
Per onestà intellettuale, e visto che era mia ignoranza, penso sia giusto rettificare la mia precedente affermazione su sqlite.
Carlo.