ME AJUDEM (Delphi 7)

Delphi

12/04/2023

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.
Lucas Dourado

Lucas Dourado

Curtidas 0

Respostas

Arthur Heinrich

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:

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

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:

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

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
POSTAR