dbgrid birden fazla kayıt seçme

Delphi'de kod yazma ile ilgili sorularınızı bu foruma yazabilirsiniz.
erdogan_ozkaya
Üye
Mesajlar: 839
Kayıt: 03 Eki 2007 02:00

dbgrid birden fazla kayıt seçme

Mesaj gönderen erdogan_ozkaya »

Arkadaşlar,

bir A listem var her kaydın altında da başka B kayırlar var,
dbgrid cell clik olayına nasıl bir şey yapabilirim ki, aşağıdaki sql sorgusunu hazırlayayım

bir kayıtta seçebilir birden fazla kayıtta seçebilirim

Kod: Tümünü seç

procedure TTEKNIK_SERVIS_PENCERE.dbgrd1CellClick(Column: TColumn);
begin
    mmo1.Lines.Add(''QRYSERVIS_KAYIT_DBSERVIS_ID.Text);
end;



select * from TEKNIK_SERVIS_DETAY WHERE SERVIS_ID IN  ('1', '2', '5') 
teşekkürler


Hayırlı ramazanlar :)
ertank
Kıdemli Üye
Mesajlar: 1650
Kayıt: 12 Eyl 2015 12:45

Re: dbgrid birden fazla kayıt seçme

Mesaj gönderen ertank »

Merhaba,

Normalde TDBGrid bahsettiğiniz şekilde br özelliğe sahip değildir.

Alternatif yöntem olarak:
1- Tablo içine seçim gibi bir kolon ekleyerek "seçim modu" gibi bir uygulama modifikasyonu ile tıklanan satırın seçili/seçili değil ayarlarını yapabilirsiniz. Ardından sadece seçili olan kayıtlar için istediğiniz sorguyu hazırlayabilirsiniz.
2- MemoryTable kullanarak mevcut kayıtların kopyasını alabilir. Seçim kolonunu MemoryTable alanı olarak kullanabilirsiniz. Yöntem 1 numaralı gibi olacak ancak bu şekilde kullanım ile database tablolarında değişiklik gerekmeyecektir.
erdogan_ozkaya
Üye
Mesajlar: 839
Kayıt: 03 Eki 2007 02:00

Re: dbgrid birden fazla kayıt seçme

Mesaj gönderen erdogan_ozkaya »

Hocam cevabınız için teşekkür ederim, eğer başka çözüm yok ise, şu kayıtları aktar diyip bir kutucuğa 1,2,3,5,9 yazıp bunu da sql formatına dönüştürcem artık daha mantıklı gibi

örn:
Resim
erdogan_ozkaya
Üye
Mesajlar: 839
Kayıt: 03 Eki 2007 02:00

Re: dbgrid birden fazla kayıt seçme

Mesaj gönderen erdogan_ozkaya »

Hocam Aşağıdaki kod işimi görüyor fakat komple satırı alıyor sadece SERVIS_ID almasını nasıl yaparım

Kod: Tümünü seç

 Const
  //Tab character
  Delim = CHR(9);
var
  i: Integer;
  x: Integer;
  S: String;
  Y: String;
begin
  //Copy Fieldnames First
  Y := '';
  for x := 0 to dbgrd1.Columns.Count - 1 do
  Y := Y + (format('%s',[dbgrd1.columns[x].title.caption]))+ Delim;
  mmo1.Lines.Add(Y);

  //Copy Field contents
  if dbgrd1.SelectedRows.Count > 0 then
  begin
    with dbgrd1.DataSource.DataSet do
    begin
      for i := 0 to dbgrd1.SelectedRows.Count-1 do
      begin
          //Bookmark sets the position of the selection
          S := '';
          GotoBookmark(Tbookmark(dbgrd1.SelectedRows[i]));
          for x := 0 to dbgrd1.Columns.Count - 1 do
          Begin
          S := S + (format('%s',[dbgrd1.columns[x].field.asString]))+ Delim;
          end;
          mmo1.Lines.Add(S);
        end;
      end;
    end;
ertank
Kıdemli Üye
Mesajlar: 1650
Kayıt: 12 Eyl 2015 12:45

Re: dbgrid birden fazla kayıt seçme

Mesaj gönderen ertank »

SERVIS_ID DBGrid içindeki hangi kolon bilemiyorum. Aşağıdaki döngü yerine

Kod: Tümünü seç

for x := 0 to dbgrd1.Columns.Count - 1 do
begin
  S := S + (format('%s',[dbgrd1.columns[x].field.asString]))+ Delim;
end;
Tek satır olarak şunu yazmanız mümkün sanırım

Kod: Tümünü seç

  S := Format('%s',[dbgrd1.columns[SERVIS_ID_KOLON_NUMARASI].Field.AsString]));
Tabi yukarıda SERVIS_ID_KOLON_NUMARASI yerine doğru rakamı yazmanız gerekli.
erdogan_ozkaya
Üye
Mesajlar: 839
Kayıt: 03 Eki 2007 02:00

Re: dbgrid birden fazla kayıt seçme

Mesaj gönderen erdogan_ozkaya »

oldu ama başlıklarıda alıyor neden olabilir acaba ?
erdogan_ozkaya
Üye
Mesajlar: 839
Kayıt: 03 Eki 2007 02:00

Re: dbgrid birden fazla kayıt seçme

Mesaj gönderen erdogan_ozkaya »

anlamadım valla bir çalışıyor bir çalışmıyor çalışıyordu şimdi çalışmıyor neden anlamadım
erdogan_ozkaya
Üye
Mesajlar: 839
Kayıt: 03 Eki 2007 02:00

Re: dbgrid birden fazla kayıt seçme

Mesaj gönderen erdogan_ozkaya »

Arkadaşlar,

Aşağıdaki kod ile işimi çözüyorum ama şöyle bir sorunum var sql sorgusunda eğer bir kayıt seçili ise virgül koymasın birden fazla seçili ise de son kayıta virgül koymasın
nasıl yapabilirim ?

Kod: Tümünü seç

select * from TEKNIK_SERVIS_STOK_DETAY WHERE SERVIS_KIMLIK IN  (
'16',
'14',
'13',
)

Kod: Tümünü seç

procedure TTEKNIK_SERVIS_PENCERE.pmSERVIS_POPUPPopup(Sender: TObject);
var
  i,x: Integer;
  S,Y: String;
begin
begin
          mmo1.Lines.Clear;
          mmo1.Lines.Add('select * from TEKNIK_SERVIS_STOK_DETAY WHERE SERVIS_KIMLIK IN  (');
end;

  if dbgrd1.SelectedRows.Count > 0 then
  begin
    with dbgrd1.DataSource.DataSet do
    begin
      for i := 0 to dbgrd1.SelectedRows.Count-1 do
       begin
          S := '';
          GotoBookmark(Tbookmark(dbgrd1.SelectedRows[i]));
          for x := 0 to dbgrd1.Columns.Count - 1 do
          Begin
           S := Format('%s',[dbgrd1.Columns[1].Field.AsString]);
          end;
          mmo1.Lines.Add(''+#39+S+#39+',');
       end;
      end;
    end;
  begin
          mmo1.Lines.Add(')');
  end;
ertank
Kıdemli Üye
Mesajlar: 1650
Kayıt: 12 Eyl 2015 12:45

Re: dbgrid birden fazla kayıt seçme

Mesaj gönderen ertank »

erdogan_ozkaya yazdı:oldu ama başlıklarıda alıyor neden olabilir acaba ?
Aşağıdaki kod sebebi ile olabilir mi acaba?

Kod: Tümünü seç

  //Copy Fieldnames First
  Y := '';
  for x := 0 to dbgrd1.Columns.Count - 1 do
  Y := Y + (format('%s',[dbgrd1.columns[x].title.caption]))+ Delim;
  mmo1.Lines.Add(Y);
erdogan_ozkaya
Üye
Mesajlar: 839
Kayıt: 03 Eki 2007 02:00

Re: dbgrid birden fazla kayıt seçme

Mesaj gönderen erdogan_ozkaya »

hocam onu hallettim bir çok kod deneyince gözden kaçmış kocamanda yazıyor fieldname die :) sql sorgusunu toparlayamadım
ertank
Kıdemli Üye
Mesajlar: 1650
Kayıt: 12 Eyl 2015 12:45

Re: dbgrid birden fazla kayıt seçme

Mesaj gönderen ertank »

erdogan_ozkaya yazdı:Arkadaşlar,

Aşağıdaki kod ile işimi çözüyorum ama şöyle bir sorunum var sql sorgusunda eğer bir kayıt seçili ise virgül koymasın birden fazla seçili ise de son kayıta virgül koymasın
nasıl yapabilirim ?

Kod: Tümünü seç

select * from TEKNIK_SERVIS_STOK_DETAY WHERE SERVIS_KIMLIK IN  (
'16',
'14',
'13',
)

Kod: Tümünü seç

procedure TTEKNIK_SERVIS_PENCERE.pmSERVIS_POPUPPopup(Sender: TObject);
var
  i,x: Integer;
  S,Y: String;
begin
begin
          mmo1.Lines.Clear;
          mmo1.Lines.Add('select * from TEKNIK_SERVIS_STOK_DETAY WHERE SERVIS_KIMLIK IN  (');
end;

  if dbgrd1.SelectedRows.Count > 0 then
  begin
    with dbgrd1.DataSource.DataSet do
    begin
      for i := 0 to dbgrd1.SelectedRows.Count-1 do
       begin
          S := '';
          GotoBookmark(Tbookmark(dbgrd1.SelectedRows[i]));
          for x := 0 to dbgrd1.Columns.Count - 1 do
          Begin
           S := Format('%s',[dbgrd1.Columns[1].Field.AsString]);
          end;
          mmo1.Lines.Add(''+#39+S+#39+',');
       end;
      end;
    end;
  begin
          mmo1.Lines.Add(')');
  end;
Aşağıdaki şekilde deneyebilir misiniz?

Kod: Tümünü seç

procedure TTEKNIK_SERVIS_PENCERE.pmSERVIS_POPUPPopup(Sender: TObject);
var
  i,x: Integer;
  S: String;
begin
  mmo1.Lines.Clear;
  mmo1.Lines.Add('select * from TEKNIK_SERVIS_STOK_DETAY WHERE SERVIS_KIMLIK IN  (');

  if dbgrd1.SelectedRows.Count > 0 then
  begin
    with dbgrd1.DataSource.DataSet do
    begin
      for i := 0 to dbgrd1.SelectedRows.Count-1 do
      begin
        S := EmptyStr;
        GotoBookmark(Tbookmark(dbgrd1.SelectedRows[i]));
        for x := 0 to dbgrd1.Columns.Count - 1 do
        begin
          S := dbgrd1.Columns[1].Field.AsString;
        end;
        mmo1.Lines.Add(QuotedStr(S)+',');
      end;
    end;
  end;
  // Eğer Memo içinde satır varsa
  if mmo1.Lines.Count > 0 then
  begin
    // Son satırın son karakteri virgül ise sil
    S := mmo1.Lines[mmo1.Lines.Count-1];
    if S[Length(S)] = ',' then 
    begin
      SetLength(S, Length(S)-1);
      mmo1.Lines[mmo1.Lines.Count-1] := S;
    end;
  end;
    
  mmo1.Lines.Add(')');
end;
erdogan_ozkaya
Üye
Mesajlar: 839
Kayıt: 03 Eki 2007 02:00

Re: dbgrid birden fazla kayıt seçme

Mesaj gönderen erdogan_ozkaya »

oldu çok teşekkür ederim gerçekten :)
erdogan_ozkaya
Üye
Mesajlar: 839
Kayıt: 03 Eki 2007 02:00

Re: dbgrid birden fazla kayıt seçme

Mesaj gönderen erdogan_ozkaya »

Hocam,

Kod windowsta çalışıyor ama android de son virgülü kaldırmıyor neden olabilir acaba ?

Teşekkürler.
ertank
Kıdemli Üye
Mesajlar: 1650
Kayıt: 12 Eyl 2015 12:45

Re: dbgrid birden fazla kayıt seçme

Mesaj gönderen ertank »

Merhaba,

- Android üzerinde birebir aynı kodu kullandığınıza emin misiniz?
- Aşağıdaki gibi bir iki noktaya ShowMessage() eklediğinizde yapması gereken ama yapmadığı bir noktayı anlayabiliyor musunuz?

Kod: Tümünü seç

procedure TTEKNIK_SERVIS_PENCERE.pmSERVIS_POPUPPopup(Sender: TObject);
var
  i,x: Integer;
  S: String;
begin
  mmo1.Lines.Clear;
  mmo1.Lines.Add('select * from TEKNIK_SERVIS_STOK_DETAY WHERE SERVIS_KIMLIK IN  (');

  if dbgrd1.SelectedRows.Count > 0 then
  begin
    with dbgrd1.DataSource.DataSet do
    begin
      for i := 0 to dbgrd1.SelectedRows.Count-1 do
      begin
        S := EmptyStr;
        GotoBookmark(Tbookmark(dbgrd1.SelectedRows[i]));
        for x := 0 to dbgrd1.Columns.Count - 1 do
        begin
          S := dbgrd1.Columns[1].Field.AsString;
        end;
        mmo1.Lines.Add(QuotedStr(S)+',');
      end;
    end;
  end;
  // Eğer Memo içinde satır varsa
  if mmo1.Lines.Count > 0 then
  begin
    ShowMessage('Memo içinde satır var'); // kontrol amaçlı
    // Son satırın son karakteri virgül ise sil
    S := mmo1.Lines[mmo1.Lines.Count-1];
    ShowMessage('Düzenlenen bilgi: ' + AnsiQuotedStr(S, '"')); // kontrol amaçlı
    if S[Length(S)] = ',' then 
    begin
      ShowMessage('Düzenlenen bilgi son karakteri virgül olarak algılandı'); // kontrol amaçlı
      SetLength(S, Length(S)-1);
      ShowMessage('Düzenlenmiş bilgi son hali: ' + AnsiQuotedStr(S, '"')); // kontrol amaçlı
      mmo1.Lines[mmo1.Lines.Count-1] := S;
    end;
  end;
    
  mmo1.Lines.Add(')');
end;
erdogan_ozkaya
Üye
Mesajlar: 839
Kayıt: 03 Eki 2007 02:00

Re: dbgrid birden fazla kayıt seçme

Mesaj gönderen erdogan_ozkaya »

Hocam,

if S[Length(S)] = ',' then bu satırdan virgülü kaldırınca androidde çalışıyor ekleyincede windows ta çalışıyor

Teşekkürler
Cevapla