ME AJUDEM (Delphi 7)
Alguem pode me ajudar (Delphi 7)?
preciso usar um Memo para escrever solicitações, como se fosse um bloco de notas ou um campo para reclamações do atendimento, etc...e preciso que, ao clicar em um BitBtn, ele insira as informações do Memo na minha tabela no banco de dados.
da um help pf.
preciso usar um Memo para escrever solicitações, como se fosse um bloco de notas ou um campo para reclamações do atendimento, etc...e preciso que, ao clicar em um BitBtn, ele insira as informações do Memo na minha tabela no banco de dados.
da um help pf.
Lucas Dourado
Curtidas 0
Respostas
Arthur Heinrich
12/04/2023
O conteúdo de um memo pode ser maior do que 4 KB ou 8 KB, que costuma ser o limite para uma variável do tipo VARCHAR.
Neste caso, você terá que utilizar colunas do tipo LOB (Large Object). Devido à natureza de texto da informação, o uso de uma coluna do tipo CLOB (Character LOB) é o indicado. Vai depender do tipo de banco que você está utilizando.
Eu já implementei algumas aplicações que tem esta característica e, no meu caso, não encontrei uma forma de fazer o insert do LOB diretamente.
O que fiz foi fazer o insert apenas com as outras colunas e, depois, executo um update do registro salvando o conteúdo do lob.
Escrevi uma rotina assim:
Chamo a rotina após o insert:
UpdateCLOBColumn('tabela', 'coluna_clob', 'coluna_pk = '+QuotedStr(IDReg), StringReplace(M.SelText,#13,'',[rfReplaceAll]));
No meu caso, utilizei M.SelText para salvar apenas a parte selecionada do texto, mas poderia ser M.Text.
Executei um StringReplace para remover os caracteres "ENTER" (#13).
No banco, a quebra de linha geralmente utiliza apenas o Line Feed (#10) e não uma combinação de Cariage Return + Line Feed (CR+LF = #13#10).
Neste caso, você terá que utilizar colunas do tipo LOB (Large Object). Devido à natureza de texto da informação, o uso de uma coluna do tipo CLOB (Character LOB) é o indicado. Vai depender do tipo de banco que você está utilizando.
Eu já implementei algumas aplicações que tem esta característica e, no meu caso, não encontrei uma forma de fazer o insert do LOB diretamente.
O que fiz foi fazer o insert apenas com as outras colunas e, depois, executo um update do registro salvando o conteúdo do lob.
Escrevi uma rotina assim:
procedure UpdateCLOBColumn(Table, Column, WhereClause, Value : String); var Q : TQuery; begin ParamCheck:=True; Q:=CreateSQL( ['update '+Table+' set', ' '+Column+' = :'+Column, 'where', ' '+WhereClause]); ParamCheck:=False; Q.ParamByName(Column).Value:=Value; Q.ExecSQL; Q.Free; end;
Chamo a rotina após o insert:
UpdateCLOBColumn('tabela', 'coluna_clob', 'coluna_pk = '+QuotedStr(IDReg), StringReplace(M.SelText,#13,'',[rfReplaceAll]));
No meu caso, utilizei M.SelText para salvar apenas a parte selecionada do texto, mas poderia ser M.Text.
Executei um StringReplace para remover os caracteres "ENTER" (#13).
No banco, a quebra de linha geralmente utiliza apenas o Line Feed (#10) e não uma combinação de Cariage Return + Line Feed (CR+LF = #13#10).
GOSTEI 0
Arthur Heinrich
12/04/2023
O conteúdo de um memo pode ser maior do que 4 KB ou 8 KB, que costuma ser o limite para uma variável do tipo VARCHAR.
Neste caso, você terá que utilizar colunas do tipo LOB (Large Object). Devido à natureza de texto da informação, o uso de uma coluna do tipo CLOB (Character LOB) é o indicado. Vai depender do tipo de banco que você está utilizando.
Eu já implementei algumas aplicações que tem esta característica e, no meu caso, não encontrei uma forma de fazer o insert do LOB diretamente.
O que fiz foi fazer o insert apenas com as outras colunas e, depois, executo um update do registro salvando o conteúdo do lob.
Escrevi uma rotina assim:
Chamo a rotina após o insert:
UpdateCLOBColumn('tabela', 'coluna_clob', 'coluna_pk = '+QuotedStr(IDReg), StringReplace(M.SelText,#13,'',[rfReplaceAll]));
No meu caso, utilizei M.SelText para salvar apenas a parte selecionada do texto, mas poderia ser M.Text.
Executei um StringReplace para remover os caracteres "ENTER" (#13).
No banco, a quebra de linha geralmente utiliza apenas o Line Feed (#10) e não uma combinação de Cariage Return + Line Feed (CR+LF = #13#10).
Neste caso, você terá que utilizar colunas do tipo LOB (Large Object). Devido à natureza de texto da informação, o uso de uma coluna do tipo CLOB (Character LOB) é o indicado. Vai depender do tipo de banco que você está utilizando.
Eu já implementei algumas aplicações que tem esta característica e, no meu caso, não encontrei uma forma de fazer o insert do LOB diretamente.
O que fiz foi fazer o insert apenas com as outras colunas e, depois, executo um update do registro salvando o conteúdo do lob.
Escrevi uma rotina assim:
procedure UpdateCLOBColumn(Table, Column, WhereClause, Value : String); var Q : TQuery; begin ParamCheck:=True; Q:=CreateSQL( ['update '+Table+' set', ' '+Column+' = :'+Column, 'where', ' '+WhereClause]); ParamCheck:=False; Q.ParamByName(Column).Value:=Value; Q.ExecSQL; Q.Free; end;
Chamo a rotina após o insert:
UpdateCLOBColumn('tabela', 'coluna_clob', 'coluna_pk = '+QuotedStr(IDReg), StringReplace(M.SelText,#13,'',[rfReplaceAll]));
No meu caso, utilizei M.SelText para salvar apenas a parte selecionada do texto, mas poderia ser M.Text.
Executei um StringReplace para remover os caracteres "ENTER" (#13).
No banco, a quebra de linha geralmente utiliza apenas o Line Feed (#10) e não uma combinação de Cariage Return + Line Feed (CR+LF = #13#10).
Minha função CreateSQL nada mais é do que um acelerador.
Ela apenas instancia a classe TQuery, atribui parâmetro Database e seta algumas propriedades, e adiciona a query.
Acredito que seja fácil adaptar a rotina acima.
GOSTEI 0
Emerson Nascimento
12/04/2023
e se você ligar um TDBMemo ao seu dataset/campo? (estou supondo que você sabe usar um TDBEdit)
GOSTEI 0