Grade em tempo de execução com FORTES REPORT

Delphi

04/05/2015

Olá pessoal!

Meu problema é o seguinte:
eu tenho uma tabela que possui as informações: código do produto, descrição, grade1, grade2 e quantidade.
Então por exemplo, nessa tabela eu possuo 2 registros:
1, camiseta verde P, verde, P e 1;
2, camiseta verde M, verde, M e 1.

Quando eu abro esse registro para exibição, eu o coloco em grade, ou seja, crio o clientdataset em tempo de execução,
colocando os fields como cor/tamanho, todas as grade2 e o total. Ficaria mais ou menos assim:

COR/TAMANHO | P | M | TOTAL

E vou inserindo nesse clientdataset, então quando coloco ele em um DBGRID, é exibido da seguinte forma:

COR/TAMANHO | P | M | TOTAL
VERDE | 1 | 1 | 2
TOTAL | 1 | 1 | 2

Porém, não sei como fazer isso em um relatório, no Fortes Report.
Alguém tem alguma ideia?

[img:descricao=Grade]http://arquivo.devmedia.com.br/forum/imagem/393515-20150504-172152.png[/img]
Wash

Wash

Curtidas 0

Respostas

Wash

Wash

04/05/2015

Esse é o código que uso para montar a grade e preencher o DBGRID com o CLIENTDATASET.

Está funcionando perfeitamente!

Agora para criar essa mesma grade no FORTES REPORT em tempo de execução, eu não tenho ideia.

procedure TfrmGrade.MontarGrade;
var
  cds1,
    cds2: TClientDataSet;
  g1, g2, ng1, ng2: string;
  procedure DefineTamanho(tam: integer);
  var
    w: integer;
  begin

    DBGridEh1.Columns[0].Width := cdsGrade.fieldbyname('TIPO_Y').Size;

    for w := 2 to DBGridEh1.Columns.Count - 1 do
    begin
      DBGridEh1.Columns[w].Width := tam;
      DBGridEh1.Columns[w].Footer.ValueType := fvtSum;
      DBGridEh1.Columns[w].Footer.FieldName := DBGridEh1.Columns[w].FieldName;
    end;
  end;
begin
  cdsGrade.DisableControls;
  if cdsgrade.Active then
    sistema.Db.DeleteAll(cdsGrade, false, false);

  g1 := sistema.Db.getFieldValue('select CODIGRADE1 from mpalmo where codi = ' +
    cdsDadosPriITEMPAI.AsString, 'CODIGRADE1');
  g2 := sistema.Db.getFieldValue('select CODIGRADE2 from mpalmo where codi = ' +
    cdsDadosPriITEMPAI.AsString, 'CODIGRADE2');
  if ((g1 <> '') and (g2 <> '')) then
  begin
    cds1 :=
      criaTClientDataSet('select * from GRADEITEMPAIITE where st=''A'' and Codigrade='
      + g1 + ' ORDER BY DES ');
    cds2 :=
      criaTClientDataSet('select * from GRADEITEMPAIITE where st=''A'' and Codigrade='
      + g2 + ' ORDER BY DES ');
    ng1 := sistema.Db.getFieldValue('select DES from GRADEITEMPAI where Codi=' +
      g1, 'DES');
    ng2 := sistema.Db.getFieldValue('select DES from GRADEITEMPAI where Codi=' +
      g2, 'DES');
    cdsD1.Data := cds1.Data;
    cdsD2.Data := cds2.Data;
    cdsGrade.Fields.Clear;
    cdsGrade.FieldDefs.Clear;

    // --- Monta a Grade

    cdsGrade.FieldDefs.Add('TIPO_Y', ftString, 60);
    cdsGrade.FieldDefs.Add('CODIGRADEITEMPAIITE', ftInteger);
    cds2.First;
    while not cds2.Eof do
    begin
      cdsGrade.FieldDefs.Add(cds2.fieldbyname('CODI').AsString, ftFloat);
      cds2.Next;
    end;

    cdsGrade.FieldDefs.Add('TOT', ftFloat);

    cdsGrade.Close;
    cdsGrade.CreateDataSet;
    cdsGrade.Open;

    cds2.First;
    while not cds2.Eof do
    begin
      with cdsGrade do
      begin
        if FieldByName(cds2.fieldbyname('CODI').AsString) is TFloatField then
        begin
          FieldByName(cds2.fieldbyname('CODI').AsString).DisplayLabel :=
            cds2.fieldbyname('DES').AsString;
          FieldByName(cds2.fieldbyname('CODI').AsString).OnValidate :=
            cdsGradeYValidate;
        end;
      end;
      cds2.Next;
    end;

    // --- Colunas Montadas

    cds1.First;
    while not cds1.Eof do
    begin
      cdsGrade.Insert;
      cdsGrade.FieldByName('TIPO_Y').AsString :=
        cds1.fieldbyname('DES').AsString;
      cdsGrade.FieldByName('CODIGRADEITEMPAIITE').AsInteger :=
        cds1.fieldbyname('CODI').AsInteger;
      cdsGrade.Post;
      cds1.Next;
    end;

    with cdsGrade do
    begin
      FieldByName('TOT').DisplayLabel := 'TOTAL';
      FieldByName('TOT').ReadOnly := true;
      FieldByName('TIPO_Y').ReadOnly := true;
    end;

    cds1.Close;
    freeandnil(cds1);
    cds2.Close;
    freeandnil(cds2);

  end;
  cdsGrade.EnableControls;
  DBGridEh1.Repaint;
  DBGridEh1.Columns[1].Visible := false;
  Sleep(100);
  Application.ProcessMessages;
  DefineTamanho(70);
  DBGridEh1.Columns[0].Title.Caption := ng1 + '/' + ng2;
end;
GOSTEI 0
Wash

Wash

04/05/2015

Resolvi com um POG mesmo.

Criei as colunas e as deixei com VISIBLE false, conforme for preenchendo, vou colocando o VISIBLE para true.
GOSTEI 0
POSTAR