ME AJUDEM (Delphi 7)

12/04/2023

0

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

Responder

Posts

12/04/2023

Arthur Heinrich

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).
Responder

12/04/2023

Arthur Heinrich

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.
Responder

14/04/2023

Emerson Nascimento

e se você ligar um TDBMemo ao seu dataset/campo? (estou supondo que você sabe usar um TDBEdit)







Responder

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar