Ir para conteúdo
Fórum Script Brasil

DanielR

Membros
  • Total de itens

    50
  • Registro em

  • Última visita

Posts postados por DanielR

  1. Boa noite Pessoal!

    Bom tenho duas aplicações uma roda o sistema administrativo e a outra é o sistema de Faturamento com Emissão de Nota Fiscal Eletronica.

    O banco de dados é o mesmo para as aplicações.

    No banco tenho diversas tabelas entre elas a tabela DOCUMENTO e DOCUMENTO_ITENS. Essa ultima tem uma trigger que ajusta o estoque.

    Na aplicação 1 quando faço um movimentos de estoque beleza. Otimo Funciona! Na aplicação 2 o documento eo itens são gravados porém a trigger não dispara.

    Estou pesquisando o porque da trigger não disparar, mas até agora nada! Se encontrar algo, posto aqui na sequencia.

    Obrigado pela ajuda

  2. Bom dia pessoal.

    Bom ao executar nosso aplicativo este erro esta acontecendo 'Sem disco' (titulo da caixa) 'exception processing message c00013 ...' (msg) .

    O Engraçado é que nas pesquisas de internet temos muitas soluções diferentes para o mesmo problema.

    O Curioso é que se nós tiramos um 'determinado' cd da unidade de disco da maquina do cliente o sistema NÃO funciona

    e se colocarmos o tal 'CD' o nosso sistema funciona.

    Fasculhamos o cd por arquivos dos mais diversos e encontramos um MIDAS.DLL o qual nosso sistema tb utiliza, porém na pasta windows\system 32 o midas tb esta lá , logo não 'estaria em falta'.

    Bom se alguém passou por algo parecido e poder poder ajudar a solucionar agradeço, de qualquer forma estou no garimpo a procura do ouro, assim q achar eu posto aqui!

    Obrigado!

  3. Me perdoe esqueci de te mandar isso aqui ainda para completar.

    5º quando você chama o metodo na persistencia é esse que é executado ( um exemplo)

    function TClientesPst.SQL(filtro: string): OleVariant;

    var

    query : TIBDataSet;

    begin

    query := TIBDataSet.Create(nil);

    try

    try

    Query.database := self.conn; //

    Query.Close;

    Query.SelectSQL.Clear;

    // aqui você coloca o seu Select generico

    Query.SelectSQL.Add('SELECT pessoas.*, clientes.* ');

    Query.SelectSQL.Add(' FROM ');

    Query.SelectSQL.Add(' PESSOAS ');

    Query.SelectSQL.Add(' INNER JOIN CLIENTES ON (PESSOAS.ID=CLIENTES.ID)');

    Query.SelectSQL.Add('WHERE ');

    Query.SelectSQL.Add(' (1 = 1) ');

    // aqui ele verifica se o filtro é vazio ou não para então executa-lo

    if filtro<>'' then

    query.SelectSQL.Add('and '+ filtro);

    query.Open;

    result := Tutil.DataSetToOleVariant(query);

    except

    on e: exception do

    begin

    Assert(false,'');

    Tutil.doTrataException('',E);

    raise;

    end;

    end;

    finally;

    Query.Close;

    Query.Free;

    end;

    end;

    { eu tenho uma classe de utilidades gerais quando preciso dessas utilidades posso estar chamando diretamente }

    class function Tutil.DataSetToOleVariant(DS: TIBDataSet): OleVariant;

    var

    loProvider : TProvider;

    begin

    loProvider := TProvider.Create(nil);

    try

    loProvider.DataSet := DS;

    Result := loProvider.Data

    finally

    loProvider.Free;

    end;

    end;

  4. Ao que observei sua dbgrid já esta no formulario. Tche eu faria um pouco diferente, como você disse que esta fazendo uma programação Orientada a Objeto eu criaria uma classe base e nela colocaria a conexão com o banco de dados, as outras classes seriam filhas da classe base, assim você esquece deter problemas com conexão.

    Outra coisa, o dbgrid ta ligado a um DataSouce que esta ligado a um ClientDataSet ai eu criaria dentro do obejeto cliente uma consulta generica sem filtros no banco de dados (podendo é claro a aplicação do filtro quando quiser , assim poderei usar minha consulta qtas vezes quiser e em diversos casos, com filtros diferentes)

    vamos imaginar

    1º crio minha classe base - com uma propriedade do tipo da minha conexão com o banco

    TBaseClass = Class

    private

    fConn: TIBDataBase;

    function get_conn: TIBDatabase;

    protected

    public

    constructor create(loconn:TIBDataBase); virtual;

    property conn:TIBDatabase read get_conn;

    end;

    2º crio minha classe de controle filha da classe base

    // classe de controle

    TBaseControl = class(TBaseClass)

    protected

    function Incluir:integer; virtual; abstract;

    function Alterar:integer; virtual; abstract;

    function Excluir:integer; virtual; abstract;

    end;

    3º Crio minha classe Cliente filha de TBaseControl que é filha de Tbaseclass

    o proposito de você usar objetos é justamente você poder utilizar informações comuns a todos

    logo minha classe TCliente já terá os metodos Incluir, alterar e excluir NÃO implementados mas a disposição e tb a coneção com o meu Banco

    TCLiente = Class(TBaseControl)

    private

    Fiid : integer ;

    Fcnome : string ;

    protected

    function get_id: integer;

    function get_nome: string;

    procedure set_id(const Value: integer);

    procedure set_nome(const Value: string);

    public

    constructor create(loconn:TIBDataBase); override; (veja que para chamar essa classe o construtor pede uma conexão sempre)

    destructor destroy; override;

    property id : integer read get_id write set_id ;

    property nome : string read get_nome write set_nome ;

    // metodos

    function Incluir:integer; override;

    function Alterar:integer; override;

    function Excluir:integer; override;

    function getContatos: OleVariant;

    procedure doValida; virtual;

    (Aqui q queria chegar. observe este metodo, ele vai para a classe de persistencia e executa a consulta no banco retornando um olevariant)

    function sql(filtro:string):OleVariant;

    published

    end;

    implementation

    // olha como fica a chamada da consulta no banco

    // não estou falando da camada de persistencia onde esta a consulta genérica

    // o resultado disso é um dado olevariant;

    function TCLiente.sql(filtro: string): OleVariant;

    var

    loCliente: TCLientePst; //pst vem de pesistencia

    begin

    loCliente:= TCLientePst.create(self.conn);

    try

    result := loCliente.SQL(filtro);

    finally

    loCliente.free;

    end;

    end;

    4º Ta, agora você volte para a tela de onde você quer chamar a consulta e fassa assim;:

    Function TfrmCompraVenda.doClientDataSet (filtro,filtro2:string):OleVariant;

    var

    loCliente : TCliente;

    begin

    locliente := TCliente.Create(conexao);

    try

    ClientDataSet .Close;

    ClientDataSet.data := doClientDataSet (' cliente = 10'); (Veja que é só mudar o filtro e teremos novos dados)

    ClientDataSet .Open;

    finally

    loCliente.free;

    end;

    end;

    // se teu DBGrid já esta ligado a um DS e o DS ligado ao CDS, pronto os dados já estarão sendo exibidos.

    // sobre a conexão, você deve ter instanciado um objeto para fazer a conexão e atrazves de um arquivo ini ou direto você configurou. pronto

    // agora quando você abre o sistema você deve setar a conexão dizendo para a tua classe base quem é tua conexão

    Cara espero ter ajudado indiretamente, como derrepente você esta no começo do sistema , então quem sabe vale a pena pensar um pouco sobre o que falei.

  5. Bom pessoal foi cruel mas o resultado foi positivo.

    Pra quem esta acostumado com um componente de impressão so texto como o rdprint, logo um quick report da um pouco de medo,

    mas nada como umas aulas, dedicação e muita horas para testar e tirar todas as suas duvidas.

    Bom vou tentar ser breve.

    1. o quick report nos oferece bandas para impressão de dados

    basicas: pageheader, pagefooter, columnheader, title, detail e sumary

    2. Na solução do meu problema usei apenas duas delas (pageheader, pagefooter)

    3. o quick report nos oferece uma banda na paleta chamada qrsubdatail ( no meu caso usei duas tb)

    4. Para cada uma banda qrsubdetail você pode ter um cabeçalho e um rodapé (usei o recurso)

    5. a chave começa aqui.

    a ) você deve ter uma query com os dados do pedido e itens do pedido

    b ) você deve ter uma outra query com os dados das parcelas do pedido

    c ) você deve definir o quickrepor.dataset := nil ( como nulo ) pois teu condutor de dados são varias tabelas

    d ) você deve definir no primeiro qrsubdetail quem é o condutor de dados e quais dados (aqui no exemplo é o pedido e seus itens)

    QRSubDetail1.Master := suaquerydepedido

    QRSubDetail1.DataSet := suaquerydepedido

    e ) você deve definir o segundo qrsubdetail quem é o condutor de dados dele e quais dados serão impressos nele

    QRSubDetail2.Master := suaquerydepedido ( para que a cada termino de imp de pedido as parcelas deverão ser impressa)

    QRSubDetail2.DataSet := suaquerycomParcelas

    pronto. é isso (basicamente)

    meu relatorio ficou assim

    Cabeçalho do Relatorio

    Titulo do Relatorio====

    ==Pedido1======

    ===Item 1 do pedido ====

    ===Item 2 do Pedido ====

    ===Item 3 do Pedido ====

    ===Total============

    ==Formas de Pgto

    === parcela 1=========

    === parcela 2=========

    === parcela 3=========

    ==Pedido2======

    ===Item 1 do pedido ====

    ===Item 2 do Pedido ====

    ===Item 3 do Pedido ====

    ===Item 4 do Pedido ====

    ===Total============

    ==Formas de Pgto

    === parcela 1=========

    === parcela 2=========

    Rodapé do Relatório===

    Sua query de pedido poderá comportar todos os pedidos por um determinado periodo, um unico pedido, e ai va depender dos filtros que você deseja aplicar.

    Bom pessoal espero ter ajudado!

    Daniel

  6. Pessoal já fiz diversas tentativas e nada. vou tentar explicar se estiver fazendo algo de errado deem uma luz.

    esse é meu select principal:

    SELECT

    DOCUMENTOS.EMPRESA, DOCUMENTOS.CODIGO, DOCUMENTOS.TIPO_DOC, DOCUMENTOS.NUMDOC,

    DOCUMENTOS.TIPO_CUSTO, DOCUMENTOS.VALORTOTAL, DOCUMENTOS.DATA_INCLUSAO, DOCUMENTOS_ITENS.ITEM,

    DOCUMENTOS_ITENS.LOCAL, DOCUMENTOS_ITENS.QTD, DOCUMENTOS_ITENS.VALOR_DESCONTO, DOCUMENTOS_ITENS.VALOR,

    DOCUMENTOS_ITENS.VALOR_TOTAL, CIDADES.NOME as NOME_CIDADE, UF.SIGLA, PESSOAS.NOME as NOME_PESSOA, PESSOAS.ENDERECO,

    PESSOAS.NUMERO, PESSOAS.BAIRRO, PESSOAS.CEP, PESSOAS.P_REFERENCIA, ITENS.NOME as DESCRICAO

    FROM

    DOCUMENTOS

    INNER JOIN DOCUMENTOS_ITENS ON (DOCUMENTOS.EMPRESA=DOCUMENTOS_ITENS.EMPRESA)

    AND (DOCUMENTOS.CODIGO=DOCUMENTOS_ITENS.DOCUMENTO)

    INNER JOIN DOC_RECEBER ON (DOCUMENTOS.EMPRESA=DOC_RECEBER.EMPRESA)

    AND (DOCUMENTOS.CODIGO=DOC_RECEBER.CODIGO)

    INNER JOIN PESSOAS ON (DOC_RECEBER.CLIENTE=PESSOAS.ID)

    INNER JOIN UF ON (PESSOAS.ID_UF=UF.ID)

    INNER JOIN CIDADES ON (PESSOAS.ID_CIDADE=CIDADES.ID)

    INNER JOIN ITENS ON (DOCUMENTOS_ITENS.ITEM=ITENS.CODIGO)

    WHERE

    (1 = 1)

    AND DOCUMENTOS.EMPRESA = idempresa

    AND DOCUMENTOS.CODIGO = codigo

    ok, aqui tenho a pessoa, o seu pedido, os itens do pedido e tudo funciona tranquilo. O relatorio sai a mil maravilhas.

    Agora desejo colocar neste mesmo relatorio as parcelas deste documento. Para isso coloquei um qrband como rsDetail linkado com outro cds que contem a seguinte instrução.

    SELECT

    PARCELAS.PARCELA, PARCELAS.DT_VCTO, PARCELAS.VALOR, PARCELAS.STATUS

    FROM

    DOCUMENTOS

    INNER JOIN PARCELAS ON (DOCUMENTOS.EMPRESA=PARCELAS.EMPRESA)

    AND (DOCUMENTOS.CODIGO=PARCELAS.CODIGO)

    WHERE

    (1 = 1)

    AND DOCUMENTOS.EMPRESA = idempresa

    AND DOCUMENTOS.CODIGO = codigo

    e ai começa os problemas, nada é impresso, testei por curiosidade todas as bandas disponiveis no qreport, só uma funcionou a qrSubDetail, porém o resultado não é bom, pois ele imprime todas as parcelas a cada detail do relatorio principal.

    (já tentei fazer uma unica instrução, porém não deu certo pois para cada parcela um conjunto de itens é gerado na consulta. um pedido com 2 itens e 2 parcelas, são gerados 4 linhas de resultado na query).

    Vejam a instrução:

    SELECT *

    FROM

    DOCUMENTOS

    INNER JOIN DOCUMENTOS_ITENS ON (DOCUMENTOS.EMPRESA=DOCUMENTOS_ITENS.EMPRESA)

    AND (DOCUMENTOS.CODIGO=DOCUMENTOS_ITENS.DOCUMENTO)

    INNER JOIN PARCELAS ON (DOCUMENTOS.EMPRESA=PARCELAS.EMPRESA)

    AND (DOCUMENTOS.CODIGO=PARCELAS.CODIGO)

    WHERE

    (1 = 1) AND

    AND DOCUMENTOS.EMPRESA = idempresa

    AND DOCUMENTOS.CODIGO = codigo

    Fato: Devo estar errando em algum lugar na hora de definir as bandas, podem me ajudar a descobrir? Obrigado!

  7. Boa tarde pessoal, estou me quebrando com quick report (trabalho com o rdprint) e devo passar os relatorios todos para o quick report. Help!

    Problema:

    devo fazer um rel de pedidos onde tenho a pessoa o pedido os itens e as parcelas. A pessoa, o pedido e os itens beleza sem problemas. Porém mas as parcelas ta dificil. já coloquei banda de tudo quanto é jeito mas nada.

    ps. A tabela parcelas faz referencia a tabela documentos, logo se fizer um join tenho um registro de item para a mais para cada parcela.

    obrigado!

  8. Tche! Bom dia, tudo bom?

    quando temos um sistema com banco de dados firebird por exemplo você inevitalmente tera que fazer a conexão a este banco pelo aplicatvo que você esta criando.

    Então dentro do aplicativo você deve instanciar um componente de conexão (ele procura o banco e abre o banco para o uso) e outro componente para poder fazer os inserts, updates, selects e delets. Eu utilizo Interbase ( no delphi você encontra uma pelata interbase e lá tem esses componentes que estou te falando)

    ibdatabase (componente de conexão)

    ibtransaction (componente para abrir e fechar uma transação)

    ibquery (componente para fazer os inserts, delets e updates)

    Esses componetes recebem um nome dentro da sua aplicação e quando usado você coloca o nome de seu componente no lugar ''componentedeconexao'' o mesmo procede para o outros componentes.

    Sobre o tamanho do codigo para a inserção na minha opinião é minimo possivel, ali temos a conexão com o banco (necessario) a Instrução sql(necessario) os parametros (necessario) e a execução da instrução no banco(necessario) o retorno (para saber se deu certo).

    Daniel

    ps. Se você precisar de ajuda para dar-lhe mais detalhes me contate pelo email daniel@rodriza.com.br

  9. Aqui vai um modelo basico para você gravar algo no banco de dados. espero ter ajudado.

    (Codigo no botão Incluir)

    AbreUmaTransação

    try

    componentequery.database := componentedeconexão;

    componentequery.sql.clear;

    componentequery.sql.add('insert campo1, campo2, campo3');

    componentequery.sql.add('values');

    componentequery.sql.add(':valor1,:valor2,:valor3');

    componentequery.parambyname('valor1') := edt1.text;

    componentequery.parambyname('valor2') := edt2.text;

    componentequery.parambyname('valor3') := edt3.text;

    componentequery.prepare;

    componentequery.execsql;

    if componenteQuery.RowsAffected = 1 then

    comitaTransação

    else

    raise;

    except on e: exception do

    begin

    RollbackTransação

    showmessage('Impossivel Incluir ' + e.message);

    end

    end

  10. Bom pessoal, como precisamos concluir determinadas tarefas, não tive escolha a não ser ir na base de dados e mudar o campo para um data normal

    e fazer o calculo dentro do delphi mesmo e depois jogar a informação pro banco normalmente.

    Porém a duvida persiste, estarei pesquisando e assim que tiver um retorno positivo postarei, assim como alguém de vocês souber, poste ai.

    Valeu

    T+

  11. Tche, eu faria um pouco diferente da forma que você fez hj.

    1. criaria uma property publica no seu form onde esta o dbgrid chamada filtro :string;

    2. criaria um metodo protected ou private chamado sql ou pesquisa

    neste metodo colocaria:

    function TSeuForm.SQL(filtro: string): OleVariant;

    var

    query : TIBDataSet;

    begin

    query := TIBDataSet.Create(nil);

    try

    try

    Query.database := seucomponenteDeAcesso

    Query.Close;

    Query.SelectSQL.Clear;

    Query.SelectSQL.Add(' select * from SuaTabela ');

    Query.SelectSQL.Add(' where 1=1 ');

    if filtro<>'' then

    query.SelectSQL.Add('and '+ filtro);

    query.Open;

    result := DataSetToOleVariant(query); // essa função você tem que criar

    except

    on e: exception do

    raise;

    end;

    finally;

    Query.Close;

    Query.Free;

    end;

    end;

    4. cada vez que você escolhe o item no segundo form você monta uma string com o filtro que deve ser aplicado

    exemplo:

    você clicou no item 1 da lista do combo (que significa que codigo=1) então você vai alimentar a propriedade filtro que criamos no inicio com esse valor, assim:

    Seuform1.filtro := 'codigo = 1' (apenas exemplificando)

    logo abaixo

    você faz o seguinte:

    Seuform1.Seuclientedataset.close;

    Seuform1.seuclientedataset.data := SQL(Seuform1.filtro);

    Seuform1.seuclientedataset.open;

    pronto! toda vez que você clicar em pesquisar e depois escolher um cara na lista e clicar em ok a grid é fechada e aberta com os novos dados já filtrados.

    5. função que você vai precisar

    function TSeuForm.DataSetToOleVariant(DS: TIBDataSet): OleVariant;

    var

    loProvider : TProvider;

    begin

    loProvider := TProvider.Create(nil);

    try

    loProvider.DataSet := DS;

    Result := loProvider.Data

    finally

    loProvider.Free;

    end;

    end;

    6. adicionar as units

    Provider;

    IBCustomDataSet;

    Ps. Esse formato que te apresentei é melhor aplicado em uma programação Orientada a Objeto, onde você centraliza todas as ações bases em classes e formularios base, ajuda muito no rendimento da produção de um aplicativo novo principalmente.

    Se quiser ajuda posso estar te ajudando com aulas particulares.

    ou se preferir na net tem muito material de cursos gratuitos de POO (programação Orientada a Objetos).

    ex: www.istudar.com.br

  12. Boa tarde a todos!

    Pessoal é o seguinte.

    Tenho uma tabela no banco onde a cada linha tenho que calcular o valor total, bom defini que esta coluna sera calculada, ou seja cada insert, ou update o proprio banco de dados faz o calculo (funciona perfeitamente).

    Bom, na minha aplicação tenho um ClientDataSet que recebe as colunas da tabela e as exibe, porém não obtenho o calculo (mesmo colocando no evento oncalcfield a instrução) o ClientDataSet informa que o campo Valor_Total não pode ser modificado.

    Alguma idéia de como calcular no meu cliente data set sem ter que mexer no banco de dados?

    Obrigado pela ajuda!

  13. Sim jonas, quando não se tem o formulario, não foi instaciado, etc.., etc..

    Mas quando o formulario esta bem na sua frente e a um minuto atraz o programa rodou, e somento apos a inclusao de uma nova property na minha classe o sistema resolve me dizer 'Resource TfrmModalSaldosLocais Not Found''? Essa classe esta pronta desde ontem e funcionando, apenas estava agregando funcionalidades a ela, quando derrepente a mensagem.

    Bom pessoal o problema foi resolvido do jeito mais cruel que pode que pode exisitir, fazer tudo de novo.

    De qualquer forma Jonas o meu agradecimento pela sua explicação que é válida.

    pressionei adionar resposta antes de conluir.

    Como disse sua explicação esta correta é isso mesmo, mas como o meu formulário 'desapareceu' dos olhos do delphi em menos de 60s foi tempo em que fechei a aplicação publiquei uma nova property atribui um valor e dei F9 de novo. Sinceramente fiquei muito bolado com isso e com medo até de perder mais alguma coisa, na mesma hora o backup entrou em trabalho.

    Valeu Jonas

  14. O que existe é uma fasta de recurso para abri-lo porem a classe exception ERESNOTFOUND não informa qual é o recurso que o sistema esta precisando. Fizemos os testes em todos os outros formularios modais e tudo funciona normalmente, excluimos esse form modal do projeto, criamos um novo (mesmo nome), o problema persiste.

    Que barra!

    Vamos continuar as pesquisas...

  15. Bom dia a todos!

    Tchê a um minuto atraz tudo ok, rodando o projeto, abrindo o janelinha modal com os saldo solicitados etc, etc.

    Precisei adicionar uma propriedade publica a minha classe. Simples! Vou rodar o projeto e então o erro:

    'Resource TfrmModalSaldosLocais Not Found'. Galera sinceramente eu não entendi nada, de onde partiu esse erro. Vou iniciar minhas pesquisas a respeito, se alguém souber e quiser compartilhar o conhecimento agradeço.

    Daniel

    code:

    var

    loOrdemBaixa : TOrdem_Producao_baixa;

    loSaldoEstoque : TSaldoInicial;

    frmModalSaldos : TfrmModalSaldosLocais;

    begin

    loOrdemBaixa := TOrdem_Producao_baixa.create(Tutil.GetConn);

    loSaldoEstoque := TSaldoInicial.create(Tutil.GetConn);

    frmModalSaldos := TfrmModalSaldosLocais.Create(self); o erro aconteceu aqui

    try

    with cds_produtosDaOrdem do

    begin

    self.OP := FieldByName('OP').AsInteger;

    self.produto:= FieldByName('produto').AsInteger;

    self.ordem := loOrdemBaixa.ProximaOrdem(loOrdemBaixa.GetEmpresa,FieldByName('OP').AsInteger,FieldByName('produto').AsInteger);

    self.qtd := FieldByName('qtd').AsFloat;

    self.fator := doCalculaMaxBaixadoOP(loOrdemBaixa.GetEmpresa,FieldByName('OP').AsInteger,FieldByName('produto').AsInteger, (FieldByName('qtd').AsFloat * FieldByName('fator').AsFloat));

    edt_OP_baixa.Text := inttostr(self.OP);

    edt_produto.Text := inttostr(self.produto);

    edt_Ordem.Text := inttostr(self.ordem);

    edt_qtd.Text := floattostr(self.qtd);

    loSaldoEstoque.EMPRESA := loSaldoEstoque.GetEmpresa;

    loSaldoEstoque.PRODUTO := self.produto;

    loSaldoEstoque.MES := Tutil.doMes;

    loSaldoEstoque.ANO := Tutil.doAno;

    frmModalSaldos.Saldo := loSaldoEstoque;

    frmModalSaldos.SaldoNecessidade := self.fator;

    if frmModalSaldos.ShowModal = mrOk then

    begin

    edt_local.Text := inttostr(frmModalSaldos.Local);

    edt_fator.Text := floatTostr(frmModalSaldos.saldoAserUtilizado);

    self.NomeLocal := frmModalSaldos.NomeLocal;

    self.saldoDisponivel := frmModalSaldos.saldoAserUtilizado;

    end;

    edt_fator.SetFocus;

    edt_fator.SelectAll;

    end;

    finally

    frmModalSaldos.Free;

    loOrdemBaixa.Free;

    loSaldoEstoque.Free;

    end;

    end;

  16. Bom dia Carlos

    tche tu já ouviu falar em OOP ou POO (programação orientada a Objeto)?

    Trabalho assim e funciona muito bem, dando maior rendimento para todo mundo (o desenvolvedor, o sistema e o usuario pega um sistema padronizado)

    posso te ajudar se você quiser.

    daniel@rodriza.com.br

  17. Bom dia todos

    Bem tenho que um relatorio base e o mesmo cria um ClietDataSet em tempo de execução, preciso definir que apos a abertura do ClientDataSet (AfterOpen) um metodo seja carregado.

    Fiz assim (mas ta dando o seguinte erro: left side cannot be assigned to'):

    procedure TfrmBaseReport.doAbreDados;

    begin

    cdsDados.AfterOpen(cdsDados) := depoisDeAbrir; // o erro esta nesta linha

    cdsDados.Close;

    cdsDados.Data := dadosole;

    cdsDados.Open;

    cdsDados.RecordCount;

    end;

    procedure TfrmBaseReport.DepoisDeAbrirCds;

    begin

    // falta fazer o código

    end;

    Desde já agradeço.

    Valeu!

  18. O componente QuickRep é visual e aparece num formulário em tempo de projeto. No entanto, esse

    formulário não é mostrado ao usuário, mas apenas usado internamente pelo programa. Para imprimir o

    relatório, usa-se o método Print do componente. Para ver uma prévia de impressão numa janela, usa-se o

    método Preview.

    legal é isso mesmo que fiz vejam:

    procedure TfrmCadastroUF.doInternalImprimir;

    var

    loUf : TUF;

    loUFReport : TfrmUFReport;

    begin

    loUFReport := TfrmUFReport.create(self);

    loUf := TUF.create(Tutil.GetConn);

    try

    loUFReport.NomeEmpresa := Tutil.GetEmpresaNOme;

    loUFReport.Endereco := 'jkjksjdksjk ';

    loUFReport.bairro := 'sjkjkdjskjd ';

    loUFReport.cidade := 'sdjdksjdksjkj';

    loUFReport.UF := 'jjjj';

    loUFReport.logo := ExtractFilePath(Application.ExeName) + 'logo.jpg';

    loUFReport.cdsUFReport.Close;

    loUFReport.cdsUFReport.Data := louf.sql('','');

    loUFReport.cdsUFReport.Open;

    loUFReport.doPreview;

    finally

    loUFReport.Free;

    loUf.Free;

    end;

    end;

    Bom, depois disso o QuickReport mostrou sim a visualização do relatorio, porem de fundo (atras da tela de visualização) tenho o meu form do projeto.

    Alguém tem alguma idéia a respeito disso, esqueci de algo? Podem me ajudar? Obrigado!

×
×
  • Criar Novo...