Fastreportta Lookup

Delphi'de kod yazma ile ilgili sorularınızı bu foruma yazabilirsiniz.
Cevapla
ylmz
Üye
Mesajlar: 110
Kayıt: 18 Mar 2005 02:32
Konum: Antalya

Fastreportta Lookup

Mesaj gönderen ylmz »

merhaba,

veritabanında B_MEDENIHAL diye bir alanım var.
Bu alan daki değer;

0: bekar
1: evli
2: dul....

şeklinde.
Fastreport 3.10 kullanıyorum.Daha önceki sürümünde (2.5 te) rxReportun ongetvalue olayına şöyle bir kod yazıyordum.

Kod: Tümünü seç

procedure TwRapor.frxReportGetValue(const VarName: String;
  var Value: Variant);
begin
  if VarName = '[frxDBDataset1."B_MEDENIHAL"]' then 
  begin
    if field.değer = 0 then Value := 'Bekar';
    if field.değer = 1 then Value := 'Evli';
    .....
   end;
end;

ama 3.10 sürümünde ongetvalue olayına sadece değişkenler geliyor.Ve bu bir değişken olmadığından istediğim şeyi yazamıyorum.tabiki fastreportta bir değişken tanımlayarak bu işlemi yapabiliyorum.Ama delphiden yapmak istiyorum çünkü bir sürü rapor var.Her rapora tek tek değişken tanımlamadan sadece field ismine bakarak istediğim işlemi (delphi tarafında) nasıl yapabilirim?

Şimdiden Teşekkürler.
turkcanfidan
Üye
Mesajlar: 380
Kayıt: 31 Eki 2005 03:26

Mesaj gönderen turkcanfidan »

Datamodüldeki table ya da query ne bir CalculatedField eklersin. Table'ın onCalcField eventına

Kod: Tümünü seç

if Table1Cins.Value = 0 then Table1cinsiyet.Value = 'Erkek'
if Table1Cins.Value = 1 then Table1cinsiyet.Value = 'Kadın'
gibi kullanırsan table bir kere hesaplar, programın her yerinde kullanabilirsin.
ylmz
Üye
Mesajlar: 110
Kayıt: 18 Mar 2005 02:32
Konum: Antalya

Mesaj gönderen ylmz »

merhaba,

fieldları statik olarak yaratmıyorum ve aynı dataseti birbirinden farklı sql leri çalıştırmak için kullanıyorum.bu yüzden calculated field eklyemem.
ilginiz için teşekkür ederim.
ylmz
Üye
Mesajlar: 110
Kayıt: 18 Mar 2005 02:32
Konum: Antalya

Mesaj gönderen ylmz »

merhaba,

frxReport'un DoGetValue methaduna gelen parametre eğer bir veritabanı alanı ise burada gerekli işlemler yapılarak en son exit komutu ile çıkıyormuş.işlem sistem değişkenleri içinde geçerli.ben de bu methada bir koşul ekleyerek problemi çözdüm.eklediğim koşul eğer frxReport un tagı 0 dan küçükse exit komutunun çalışmamasını sağlamak.tabi isteyenler ifdef ekleyerek veya farklı mantıklarla da yapabilirler.şimdilik yapabildiğim bu.daha iyi fikirlerinizi bekliyorum.ilgilenenler içinde dogetvalu methadunu aşağıya kopyalıyorum.iyi çalışmalar.

Kod: Tümünü seç

function TfrxReport.DoGetValue(const Expr: String; var Value: Variant): Boolean;
var
  i: Integer;
  ds: TfrxDataSet;
  fld: String;
  v: TfsCustomVariable;
  val: Variant;
begin
  Result := False;
  Value := Null;

  { maybe it's a dataset/field? }
  GetDataSetAndField(Expr, ds, fld);
  if (ds <> nil) and (fld <> '') then
  begin
    Value := ds.Value[fld];
    if FEngineOptions.ConvertNulls and (Value = Null) then
      case ds.FieldType[fld] of
        fftNumeric:
          Value := 0;
        fftString:
          Value := '';
        fftBoolean:
          Value := False;
      end;
    Result := True;
    if Tag >= 0 then      //eklediğim koşul  !!!!!!!!!!!!!
      Exit;
  end;

  { searching in the sys variables }
  i := FSysVariables.IndexOf(Expr);
  if i <> -1 then
  begin
    case i of
      0: Value := FEngine.StartDate;  { Date }
      1: Value := FEngine.StartTime;  { Time }
      2: Value := FPreviewPages.CurPage - FPreviewPages.FirstPage + 1; { Page }
      3: Value := FPreviewPages.CurPage + 1;  { Page# }
      4: Value := FEngine.TotalPages - PreviewPages.FirstPage;  { TotalPages }
      5: Value := FEngine.TotalPages;  { TotalPages# }
      6: Value := FEngine.CurLine;  { Line }
      7: Value := FEngine.CurLineThrough; { Line# }
    end;
    Result := True;
    Exit;
  end;

  { value supplied by OnGetValue event }
  TVarData(val).VType := varEmpty;
  if Assigned(FOnGetValue) then
    FOnGetValue(Expr, val);
  if TVarData(val).VType <> varEmpty then
  begin
    Value := val;
    Result := True;
    Exit;
  end;

  { searching in the variables }
  i := FVariables.IndexOf(Expr);
  if i <> -1 then
  begin
    val := FVariables.Items[i].Value;
    if (TVarData(val).VType = varString) or (TVarData(val).VType = varOleStr) then
      Value := Calc(val) else
      Value := val;
    Result := True;
    Exit;
  end;

  { searching in the variable }
  v := FScript.FindLocal(Expr);
  if v <> nil then
  begin
    Value := v.Value;
    Result := True;
    Exit;
  end;
end;
Kullanıcı avatarı
athena
Üye
Mesajlar: 92
Kayıt: 20 Eyl 2003 06:32
Konum: Antalya
İletişim:

Mesaj gönderen athena »

3.0 da rapor ustune koyduğun componentin on before printi varsa
eskiden yaptığını buraya koyarsan olur sanırım.
"Millete efendilik olmaz,hizmet olur,
kim Millete hizmet ederse,
o milletin efendisidir."
Cevapla