Usamos cookies para medir audiência e melhorar sua experiência. Você pode aceitar ou recusar a qualquer momento. Veja sobre o iMasters.
Olá pessoal,
Estou tentando fazer o seguinte:
Numa ListBox tenho todos os campos de uma tabela. Quero passar esses campos para um memo, mas com um detalhe, que sejam jogadas em cada linha 7 palavras, ou seja, sete campos em cada linha para compor um select.
Alguém teria uma sugestão?
Grato,
Ilano.
Sendo mais claro, perciso disso:
No ListBox tenho os itens:
Campo1
Campo2
Campo3
Campo4
Campo5
Campo6
Campo7
Campo8
Campo9
Campo10
Campo11
Campo12
Campo13
Campo14
Campo15
Apóes percorrer o ListBox, no memo fique assim:
(Na linha 0) SELECT Campo1, Campo2, Campo3, Campo4, Campo5, Campo6, Campo7,
(Na linha 1) Campo8, Campo9, Campo10, Campo11, Campo12, Campo13, Campo14,
(Na linha 2) Campo15 FROM NOME_DA_TABELA
Colega, seu código ficou um tanto confuso e ficou difícil identificar os componentes que usou.... de todo modo, não precisa usar tantos for para fazer o que quer, 1 só já é o suficiente... vou postar aqui um exemplo que faz a mesma coisa usando um checklistbox e um memo para exibir os dados formatados em sql quando clicar no botão. No checklistbox eu adicionei direto os itens como no exemplo que passou (campo1 ... campo15).
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, CheckLst;
type
TForm1 = class(TForm)
cxSQL: TMemo;
Button1: TButton;
clbCampos: TCheckListBox;
LbTabela: TLabel;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject);
Var
iAux,
iQtdePalavras : Integer;
pCampos : String;
begin
pCampos := EmptyStr;
iQtdePalavras := 0;
cxSQL.Lines.Clear;
For iAux :=0 To clbCampos.Items.Count - 1 Do
Begin
If clbCampos.Checked[iAux] = True Then
begin
inc(iQtdePalavras);
//Pegou o primeiro item da linha, logo não precisa jogar a ',' ainda
if (Trim(pCampos) = EmptyStr) then
pCampos := 'SELECT TOP 1000 ' + clbCampos.Items.Strings[iAux]
else
begin
//Verifica se já chegou no limite de 7 palavras para decidir o próximo passo
if (iQtdePalavras) > 7 then
begin
//Insere no memo
cxSQL.Lines.Add(pCampos + ', ');
//recomeça a inserção dos campos na variável auxiliar
pCampos := clbCampos.Items.Strings[iAux];
//Reinicia o contador de palavras, agora com 1 para manter o padrão
//de quebrar a cada 7 palavras
iQtdePalavras := 1;
end
else //Se não chegou a 7 palavras, apenas acrescenta a ',' e acumula
pCampos := pCampos + ', ' + clbCampos.Items.Strings[iAux];
end;
end;
end;
//Insere os últimos itens selecionados no checklistbox
cxSQL.Lines.Add(pCampos);
cxSQL.Lines.Add('FROM ' + LbTabela.Caption + ' (NOLOCK)');
// BtnConfirmar.Enabled:=True;
end;
end.
Rodando o teste, obtive o resultado abaixo no memo, selecionando os 15 itens.
SELECT TOP 1000 Campo1, Campo2, Campo3, Campo4, Campo5, Campo6, Campo7,
Campo8, Campo9, Campo10, Campo11, Campo12, Campo13, Campo14,
Campo15
FROM TabTeste (NOLOCK)
Beleza Chrnos,
Já implementei no meu projeto, deu certinho!
Realmente ficou bem melhor, fora que você explicou com riqueza de detalhes todas as linhas.
obrigado!
O nosso mal é sair programando sem pensar no melhor meio pra isso rs.... mas se funcionou e entendeu o conceito que usei, então está ótimo rs... qualquer coisa estamos ai pra ajudar. :coolio:
Bom pessoal,
Fiz um negócio meio estranho, mas funcionou. Se alguém souber como melhorar, o que acredito que tenha como melhorar sim, por favor, esteja à vontade.
>
procedure TFrmListarCampos.BtnGerarSQLClick(Sender: TObject);
Var
begin
C:=C + 1;
ENd;
For I:=0 To clbCampos.Items.Count - 1 Do
Begin
* If clbCampos.Items.Items**.Checked = True Then*
Begin
F:=F + 1;
* cxListBox1.Items.Add(clbCampos.Items.Items**.Text);*
End;
End;
F:=cxListBox1.Items.Count;
C:=0;
For I:=0 To cxListBox1.Items.Count - 1 Do
Begin
* pCampos:=pCampos + cxListBox1.Items.Strings** + ', ';*
If (C >= 7) AND (I < F) Then
Begin
cxSQL.Lines.Add(pCampos);
pCampos:='';
C:=0;
End
Else
If (C <= 7) AND (I = F - 1) Then
Begin
cxSQL.Lines.Add(LeftStr(pCampos, (Length(pCampos) - 2)));
cxSQL.Lines.Add('FROM ' + LbTabela.Caption + ' (NOLOCK)')
End;
C:=C + 1;
End;
cxSQL.Lines.Strings[0]:='SELECT TOP 1000 ' + cxSQL.Lines.Strings[0];
BtnConfirmar.Enabled:=True;
end;