Fórum Rotina Padrão para Gravar registro na tabela #368704
26/02/2009
0
Olá a todos.
Uso Delphi 7 + Firebird + DbExpress.
Estou fazendo uma rotina para gravar registros na tabela.
Os nomes dos campos da tabela e o nome do Edit correspondente ao campo guardo num ValueListEditor tudo fica como string.
=================
Key - - - - Value
Cli_Cod - - - EdtCodigo.Text
Cli_Nome- -- EdtNome.Text
Cli_Data- - -- EdtDtCadastro.Text
Observe que a esquerda (Key) fica o nome do campo da tabela
e a direita fica o nome do Edit que esta no Form.
Não estou conseguindo gravar observe o codigo.
procedure TFrCadastroPadrao.GravarMestre(Sender: TObject);
var
i, f, c : integer;
ct, cm, dad : string;
v_campo : string;
t_campo : TEdit;
begin
c := ValueListEditorCampos.RowCount;
for i := 1 to c do
begin
if V_CliDtSt.FieldByName(ValueListEditorCampos.Cells[ 0 , i ]).DataType = ftstring then
V_CliDtSt.FieldByName(ValueListEditorCampos.Cells[ 0 , i ]).AsString := ValueListEditorCampos.Cells[ 1 , i ];
if V_CliDtSt.FieldByName(ValueListEditorCampos.Cells[ 0 , i ]).DataType = ftDate then
If ValueListEditorCampos.Cells[ 1 , i ] <> ´ / / ´ then // tem data
V_CliDtSt.FieldByName(ValueListEditorCampos.Cells[ 0 , i ]).AsString := ValueListEditorCampos.Cells[ 1 , i ]
else
V_CliDtSt.FieldByName(ValueListEditorCampos.Cells[ 0 , i ]).AsString := ´´;
if V_CliDtSt.FieldByName(ValueListEditorCampos.Cells[ 0 , i ]).DataType = ftinteger then
V_CliDtSt.FieldByName(ValueListEditorCampos.Cells[ 0 , i ]).AsInteger := V_CliDtSt.FieldByName(ValueListEditorCampos.Cells[ 1 , i ]).AsInteger;
}
V_CliDtSt.Post
end;
end;
end;
A mensagem de erro que retorna é:
EdtDtCadastro.Text is not valid date.
Ele esta gravando no campo o nome da variavel (Edit) e não o conteúdo do Edit.
Nos campos string ele até grava mas o nome do Edit.
Preciso alguma coisa do tipo macro substituição mas não temos em Delphi.
Alguem saberia como me ajudar?
Abraços e obrigado
Neto
Neto
Curtir tópico
+ 0Posts
01/03/2009
Micheus
Voce é que está distraído. Veja que vc mesmo diz que na primeira coluna (0) está o nome do campo e na segunda coluna (1) está o nome do edit.
Se vc olhar para seu código, verá que está movendo a segunda coluna para o campo do dataset, logo vc está movendo o nome do edit e não seu ´valor´.
O que vc precisaria fazer, baseado nesta sua idéia, seria buscar o componente no form baseado no nome ([i:faeecd40ee]FindComponent[/i:faeecd40ee]) que está na segunda coluna. Uma vez encontrado, então vc teria como obter o valor de sua propriedade Text.
Veja os tópicos com o método [url=http://forum.devmedia.com.br/search.php?mode=results]FindComponent[/url]
Duas dicas:
1) na verificação do tipo de dados, não use os [i:faeecd40ee]If´s[/i:faeecd40ee] do modo como fez. Em primeiro lugar, se ele for de um determinado tipo, não há porque testá-lo com outro tipo, então use [i:faeecd40ee]Else´s[/i:faeecd40ee] - imagine que vc teste todos os tipos de dados e o campo seja do primeiro tipo...
if V_CliDtSt.FieldByName(ValueListEditorCampos.Cells[0, i]).DataType = ftstring then V_CliDtSt.FieldByName(ValueListEditorCampos.Cells[0, i]).AsString := ValueListEditorCampos.Cells[1, i] else if V_CliDtSt.FieldByName(ValueListEditorCampos.Cells[0 ,i]).DataType = ftDate then ...
Mas neste caso específico, vc pode até fazer uso da estrutura [i:faeecd40ee]Case Of[/i:faeecd40ee] que ficará muito melhor:
... case V_CliDtSt.FieldByName(ValueListEditorCampos.Cells[0, i]).DataType of ftString : ... ftDate : ... ftDateTime : ... ftTime : ... ftInteger : ... end; ...
2)Quando o campo for ficar ´em branco´, não atribua ´´ use o método Clear que irá gravá-lo um nulo. No caso de fields do tipo [i:faeecd40ee]Date[/i:faeecd40ee] ou [i:faeecd40ee]DateTime[/i:faeecd40ee], quando vc passa o ´´ para o [i:faeecd40ee]AsString[/i:faeecd40ee] ele vai tentar fazer a conversão para date e retornará erro:
If Trim(ValueListEditorCampos.Cells[1, i]) <> ´/ /´ then // tem data V_CliDtSt.FieldByName(ValueListEditorCampos.Cells[0, i]).AsString := ValueListEditorCampos.Cells[1, i] else V_CliDtSt.FieldByName(ValueListEditorCampos.Cells[0, i]).Clear;
Abraços
Gostei + 0
01/03/2009
Marco Salles
function RetornarComponent(formulario:Tform;Nome:String):TEdit; begin result:=Formulario.findcomponent(Nome) as TEdit; end;
procedure TForm1.Button1Click(Sender: TObject); var i, f, c : integer; ct, cm, dad : string; v_campo : string; t_campo : TEdit; begin V_CliDtSt.Append; try try for i := 1 to c do case V_CliDtSt.FieldByName(ValueListEditorCampos.Cells[ 0 , i ]).DataType of FtString: V_CliDtSt.FieldByName(ValueListEditorCampos.Cells[ 0 , i ]).AsString := (RetornarComponent(form1,ValueListEditorCampos.Cells[ 1 , i ])).Text; ftDate: V_CliDtSt.FieldByName(ValueListEditorCampos.Cells[ 0 , i ]).AsString := (RetornarComponent(form1,ValueListEditorCampos.Cells[ 1 , i ])).Text; ftinteger : V_CliDtSt.FieldByName(ValueListEditorCampos.Cells[ 0 , i ]).AsString := (RetornarComponent(form1,ValueListEditorCampos.Cells[ 1 , i ])).Text; end; except //mensagemsn de erro V_CliDtSt.Cancel end; finally V_CliDtSt.Post; end; end;
Gostei + 0
03/03/2009
Acneto
obrigado pelas dicas, vou testar conforme sua recomendação.
Abraços.
Gostei + 0
Clique aqui para fazer login e interagir na Comunidade :)