Per farmi restituire più variabili da una function ho sempre utilizzato variabili array.
Non ho mai avuto problemi, anche in Lazarus. Ho però impiegato variabili di tipo variant.
Questa volta, dovendo ricevere dati della stessa natura, ho messo in campo variabili String.
Però il compilatore non accetta le mie dichiarazioni e mi fornisce errori come l seguenti:
frmmain.pas(1114,13) Error: Incompatible types: got "TtbRitorno" expected "AnsiString"
frmmain.pas(1357,21) Error: Incompatible types: got "AnsiString" expected "TtbRispo"
Riporto il codice scritto:
function LeggiRecPiaCont(coVoce: String): String;
type
TtbRitorno = array[0..4] of String;
var
swErro: Boolean;
descrMov: String;
sql: String = 'SELECT * FROM piancont WHERE NumVoce = ';
tbRitorno: TtbRitorno;
begin
sql:= sql + coVoce;
Form1.ZQuery1.SQL.Text:= sql;
try
Form1.ZQuery1.ExecSQL;
except
on E: Exception do
begin
swErro:= True;
ShowMessage('ERRORE ' + E.Message + System.lineending + 'nella LETTURA del record ContabFamDB.piancont.' + coVoce + System.lineending + System.lineending + '***** Il programma verra'' chiuso *****');
Application.Terminate;
end;
end;
tbRitorno[0]:= Form1.ZQuery1.FieldByName('NumVoce').AsString;
tbRitorno[1]:= Form1.ZQuery1.FieldByName('NomeVoce').AsString;
tbRitorno[2]:= Form1.ZQuery1.FieldByName('ContrPartSiNo').AsString;
tbRitorno[3]:= Form1.ZQuery1.FieldByName('DtPrimoUso').AsString;
tbRitorno[4]:= Form1.ZQuery1.FieldByName('DtUltimUso').AsString;
Result:= tbRitorno; <--- produce ERROR
end;
procedure InsRecMovvgg(dtTratt, infTb: String; ixTbMovv: Integer);
type
TtbRispo = array of String;
[...]
var
tbRispo: TtbRispo;
begin
[...]
tbRispo:= LeggiRecPiaCont(tbMovv[i, 3]); // tbMovv[i, 3], cioè "codice Voce" <--- produce ERROR
SetLength(tbRispo, 2);
nomeVoce:= tbRispo[0]; // piancont.NomeVoce
segnContrPart:= tbRispo[1]; // piancont.ContrPartSiNo
[...]
Da ieri cerco di risalire all'errore, ma qualsiasi soluzioone tentata dalla mia immaginazione è fallita. Ho provato anche a sostituire il tipo di variabili da String a Variant, ma inutilmente.
il fatto è hai dichiarato la funzione che restituisce una string (e quindi result è di tipo string)
è normale che se si assegna a result qualsiasi cosa che non sia string dia errore
dovresti quindi dichiarare una funzione che restituisca il tipo TtbRitorno
tipo:
type
TtbRitorno = array[0..4] of String;
...
function LeggiRecPiaCont(coVoce: String): TtbRitorno;
var
swErro: Boolean;
descrMov: String;
sql: String = 'SELECT * FROM piancont WHERE NumVoce = ';
tbRitorno: TtbRitorno;
begin
sql:= sql + coVoce;
Form1.ZQuery1.SQL.Text:= sql;
try
Form1.ZQuery1.ExecSQL;
except
on E: Exception do
begin
swErro:= True;
ShowMessage('ERRORE ' + E.Message + System.lineending + 'nella LETTURA del record ContabFamDB.piancont.' + coVoce + System.lineending + System.lineending + '***** Il programma verra'' chiuso *****');
Application.Terminate;
end;
end;
tbRitorno[0]:= Form1.ZQuery1.FieldByName('NumVoce').AsString;
tbRitorno[1]:= Form1.ZQuery1.FieldByName('NomeVoce').AsString;
tbRitorno[2]:= Form1.ZQuery1.FieldByName('ContrPartSiNo').AsString;
tbRitorno[3]:= Form1.ZQuery1.FieldByName('DtPrimoUso').AsString;
tbRitorno[4]:= Form1.ZQuery1.FieldByName('DtUltimUso').AsString;
Result:= tbRitorno; <--- produce ERROR
end;
il fatto è hai dichiarato la funzione che restituisce una string (e quindi result è di tipo string)
è normale che se si assegna a result qualsiasi cosa che non sia string dia errore
dovresti quindi dichiarare una funzione che restituisca il tipo TtbRitorno
Sicuramente la prova da me riportata non dimostra di avere provato anche quella che mi hai suggerito, ma ti assicuro di avere messo in pratica anche quella.
Ecco cosa viene fuori:
function LeggiRecPiaCont(coVoce: String): String;
type
TtbRitorno = array[0..4] of String;
var
swErro: Boolean;
descrMov: String;
sql: String = 'SELECT * FROM piancont WHERE NumVoce = ';
tbRitorno: TtbRitorno;
begin
sql:= sql + coVoce;
Form1.ZQuery1.SQL.Text:= sql;
try
Form1.ZQuery1.ExecSQL;
except
on E: Exception do
begin
swErro:= True;
ShowMessage('ERRORE ' + E.Message + System.lineending + 'nella LETTURA del record ContabFamDB.piancont.' + coVoce + System.lineending + System.lineending + '***** Il programma verra'' chiuso *****');
Application.Terminate;
end;
end;
tbRitorno[0]:= Form1.ZQuery1.FieldByName('NumVoce').AsString;
tbRitorno[1]:= Form1.ZQuery1.FieldByName('NomeVoce').AsString;
tbRitorno[2]:= Form1.ZQuery1.FieldByName('ContrPartSiNo').AsString;
tbRitorno[3]:= Form1.ZQuery1.FieldByName('DtPrimoUso').AsString;
tbRitorno[4]:= Form1.ZQuery1.FieldByName('DtUltimUso').AsString;
Result:= tbRitorno; <-- riga 1116
end;
Ecco l'errore segnalato dal compilatore:
frmmain.pas(1116,13) Error: Incompatible types: got "TtbRitorno" expected "AnsiString"
@petrusic
function LeggiRecPiaCont(coVoce: String): String;
Questa funzione ritorna una stringa, è per quello che il compilatore di dice che si aspetta una AnsiString ... ;D
tbRitorno non è di tipo string, ma è di tipo array of string
per fare in modo che la tua funzione ritorni un array di string devi dichiararla come segue
function LeggiRecPiaCont(coVoce: String): TtbRitorno;
tbRitorno non è di tipo string, ma è di tipo array of string
per fare in modo che la tua funzione ritorni un array di string devi dichiararla come segue
function LeggiRecPiaCont(coVoce: String): TtbRitorno;
Ma TtbRitorno è un type dichiarato dentro la stessa function, perciò scrivendo:
function LeggiRecPiaCont(coVoce: String): TtbRitorno;
type
TtbRitorno = array[0..4] of String;
var
tbRitorno: TtbRitorno;
[...]
ottengo il seguente Errore:
frmmain.pas(1097,43) Error: Identifier not found "TtbRitorno"
Per farlo funzionare devo dichiararlo fra i type della sezione Implementation
Infatti, così facendo, l'errore in compilazione non si presenta più.
Confesso che una situazione simile non rientrava nel mio orizzonte di immaginazione.
Grazie, gr....sime.