segunda-feira, 22 de junho de 2009

Rave Report - Problema com Filtro de Relatório

Hoje postarei aqui a solução de um pequeno problema que estava me tirando do sério, e pelo que percebi nas minhas buscas pela intenet muitas pessoas tem esse problema.
Fiz um relatório com o rave report com filtro de data, e também de código de produto, fiz o seguinte esquema, coloquei no comando SQL da minha Query, os parâmetros de data inicial e final e o codigo do produto, e no evento click do botão para gerar o relatório eu passo os parâmetros e executo o relatório, a primeira vez que usei esse esquema funcionou certinho, estava feliz da vida, mas quando fui fazer a mesma coisa em outro projeto, mandava gerar o relatório e ele não mostrava nada, depois de muito me descabelar, encontrei outra solução, trazer todas as informações do banco na Query e filtrar no client Data Set, e quando mandava gerar o relatório, nadaaaa, ele mostrava toda a informação do banco, como se o filtro não estive-se funcionando, foi então que enxerguei a luz, era algo tão simples que nem passava pela minha cabeça....o form que eu chamava o relatório estava como AUTO-CREATE....foi só tirar ele dessa opção que as duas maneiras que eu tinha feito funcionaram....=)
então fica ai a dica para quem estiver com o mesmo problema que eu :
VÁ EM - PROJECT -OPTIONS - e tire o form da opção AUTO-CREATE....e pronto, seja feliz

e para quem não sabe fazer o filtro nem passar parâmetros para a query aqui vai:

PASSANDO PARÂMETRO:

qry_relatorio.Close;
cds_relatorio.Close;
qry_relatorio.ParamByName('data_ini').AsDate := StrToDate(MaskEdit1.Text);
qry_relatorio.ParamByName('data_final').AsDate := StrToDate(MaskEdit2.Text);
qry_relatorio.ParamByName('codigo').AsInteger := StrToInt(edit11.Text);
qry_relatorio.ExecSQL();
qry_relatorio.Open;
qry_relatorio.Refresh;
cds_relatorio.Open;

FILTRANDO O CLIENT DATA SET: (AQUI ESTOU FILTRANDO APENAS POR DATA)

cds_fluxo.Close;
cds_fluxo.Filtered := false;
cds_fluxo.Filter := 'data >='+ QuotedStr(Edit1.Text)+'and data <='+ QuotedStr(Edit2.Text);
cds_fluxo.Filtered := true;
cds_fluxo.Open;
cds_fluxo.Refresh;

Espero ter ajudado, um abraço a todos e até a próxima

sexta-feira, 12 de junho de 2009

Usando Opendialog

Usar o Opendialog é uma coisa bem simples, mas se você está começando a programar em Delphi, como eu, certamente terá duvidas, então vou explicar uma utilidade muito boa dele, copiar o caminho de um arquivo para o texto de uma Edit, tendo o caminho do arquivo nessa edit poderemos trabalhar com ele facilmente, no meu caso usei para poder trabalhar com a importação de um arquivo TXT, mãos a obra:

Primeiro crie um projeto novo e monte a tela com os seguintes componente: 1 label, 1 edit, 1 botão e um TOpenDialog, mais ou menos como a figura abaixo:

Depois no evento click do botão coloque o seguinte código:

if OpenDialog1.Execute then begin
edit1.Text := OpenDialog1.FileName;
end
else begin
ShowMessage('Favor selecionar o arquivo !!!')
end;

pronto, o caminho do arquivo irá aparecer na edit, com isso você consegue trabalhar de varias maneiras com o arquivo.
Espero ter ajudado, um abraço a todos e até a próxima.

quarta-feira, 3 de junho de 2009

SQL Server - "não é possivel criar uma nova transação porque a capacidade foi excedida"

Como expliquei anteriormente, quando usamos componentes para conectar o Delphi com algum banco de dados, devemos deixar todos os componentes desconectados e só conecta-los quando for executar alguma transação, isso sempre funcionou comigo usando firebird, mas quando fui usar o delphi com SQL Server, mesmo deixando todos eles desconectados, me deparei com o seguinte erro:

não é possível criar uma nova transação porque a capacidade foi excedida

Fiz de tudo para funcionar e nada, já estava ficando louco quando descobri o seguinte evento do ClientDataSet

BeforeApplyUpdates

Foi o que salvou minha vida (pelo menos até o presente momento), selecionei todos os meus ClientDataSet e nesse evento coloquei o comando:

SQLConnection1.CloseDataSets;

Ou seja, depois que ele efetua qualquer transação com o banco, ele fecha o dataSet, eu tinha feito isso manualmente no fechamento de cada form, mas não foi suficiente, agora com esse evento tudo está funcionando.
Então fica ai a dica pra quem estiver com o mesmo problema.
Até mais;

segunda-feira, 1 de junho de 2009

Relatórios - Rave Report - "como receber uma variável do Delphi"

Se você pretende gerar um relatório com as informações do seu sistema com o Rave Report e está começando a usar agora, certamente vai se deparar com essa dificuldade, "como receber uma variável do Delphi ?" .
Não é nenhum bicho de 7 cabeças, mas se você não ler o que vou postar, dificilmente vai conseguir fazer, se você tem os campos prontos no seu banco de dados, ótimo, é só coloca-los no Rave e usar normalmente, assim como em outros geradores de Relatório (esse passo a passo eu mostro depois), agora se você precisa de um valor que está sendo
calculado na sua aplicação e não está sendo salvo em nenhuma tabela do seu banco, vai ter que usar passagem por parâmetro, olhe o exemplo abaixo e tudo ficará claro pra você:
Imagine que temos uma variável global em nosso sistema, onde é gravada a versão do sistema e nos relatérios voê tem que imprimir o número da versão ou seja temos que imprimir o conteúdo dessa variável que foi declarada lá dentro do projeto Delphi.

O conteúdo dessa variável deve ser passado como parâmetro na hora de imprimir o relatório e o Rave “enxerga” essa variável como se fosse uma variável interna dele.
No Delphi
Crie uma nova aplicação e deixe-a conforme a figura abaixo.


Agora dê um duplo clique no RvProject e o Rave Visual Design será aberto, na guia Report, selecione o componente Region, dimensione ele de forma que ocupe toda a área que será impressa.
No Tree Panel em Report Library e escolha o relatório Report1, após isso clique em Parameters no Object Inspector digite o nome de nosso parâmetro que será Versao
Adicione um Band Component e marque a opção Body Header que esta localizada na opção Band Style.
Adicione um DataText e clique na opção DataField, no Project Parameters selecione o parâmetro que acabamos de criar que foi o versão, após selecionar clique em Insert Parameter
O Resultado final será conforme a figura abaixo.


Salve seu projeto, como Project1 mesmo, agora volte lá no Delphi e no RvProject associe a propriedade ProjectFile ao projeto que acabamos de criar

Adicione o seguinte código no Button.
procedure TForm1.Button1Click(Sender: TObject);
begin

//Seta o Parametro versão com o conteúdo do Label1
RvProject1.SetParam('Versao',Label1.Caption);

//Executa o relatorio
RvProject1.ExecuteReport('Report1');
end;
Agora é só compilar, e testar e nosso resultado final será semelhante a imagem abaixo.
Preview do Rave com o Valor do parâmetro que foi recebido
Pronto, agora pode por a caixola pra funcionar e gerar o relatório que quizer !!!! boa sorte !!!





sexta-feira, 29 de maio de 2009

C# - Aplicação em Camadas

Hoje vou postar algo sobre Csharp/SqlSever, como você já deve saber, hoje em dia o que domina o mercado são ferramentas O.O (Orientada a Objeto), e aplicações feitas em camadas.
A ferramenta que eu mais gosto é Csharp, acho ela muito completa, tanto quanto JAVA, e em aplicações Desktop acho bem melhor, ainda estou aprendendo a usar os recursos dessa poderosa ferramenta e coloquei no rapidshare uma aplicação feita em camadas explicada passo a passo(é muito grande para eu colocar aqui..rs).

http://rapidshare.com/files/238563434/Desenvolvimento_Multicamadas_em_Csharp.doc.html

Peguei esse documento na Devmedia, aprendi muita coisa com essa explicação, é das melhores que já li.
Estou buscando informações sobre WPF, uma nova maneira de desenvolver do Visual Studio, assim que eu tiver bastante informações posto aqui pra vocês.
Quem quiser ir conhecendo é só entrar aqui:

http://msdn.microsoft.com/pt-br/library/cc564903.aspx

Por hoje é só pessoal, um abraço a todos e até mais.

quinta-feira, 28 de maio de 2009

Delphi - Manipulando Dados ( CRUD)

Como prometi, vou explicar agora inclusão, Alteração e Exclusão de dados do banco.
Agora que nossa aplicação já está conectada com o banco (se a sua não está, dê uma olhadinha no post anterior), vamos a preparação das telas, podemos fazer de duas maneiras:
1 - Trazer os campos direto da query, deixando assim eles conectados automaticamente no banco.
2 - Colocar as Label's e Edit's do jeito que quisermos e depois no evento click dos botões, passamos as informações para o ClientDataSet.
Farei da maneira numero 1, pois o código ficara mais fácil de ser entendido, com o tempo você escolhe a maneira que mais lhe agradar, e que a sua aplicação necessitar.
Obs: Estou deixando meus componentes todos ativados, pois o foco aqui é a manipulação dos dados, vale lembrar que o ideal seria mantelos desativados, e ativa-los pelo código conforme a necessidade.
Faremos uma tela de cadastro de clientes, bem simples só para aprendizado, no form que você vai montar a tela, aperte a tecla F12, ele mostrará o código do form, em baixo da palavra implementation, você vai dizer que usaremos o Modulo, então ficará assim:

implementation uses

Modulo;


Agora vá para o Modulo e dê dois cliques no qry_clientes, a tela que abrirá estará mostrando os campos da sua tabela no banco, deixe essa tela aberta e vá para o form , arreste os campos da telinha para o form, já serão criadas uma label e um dbedit, a label você dá o nome que desejar, e vai montando sua tela do jeito que quizer, agora coloque 5 botôes(Incluir, Alterar, Gravar, Excluir, Cancelar) e um dbgrid, minha tela ficou assim:

Como você pode perceber, o Delphi já criou um data source nesse form, mas não vamos usa-lo, para evitar bagunça, vamos usar o que já criamos no Modulo, então delete esse que ele criou, e nas opções DataSource das dbedits você seleciona dm -> ds_clientes, e também coloque a mesma coisa na propriedade DataSource do DbGrid, pronto estamos conectados, se você tiver informações cadastradas nessa tabela, ela já estará aparecendo ai pra vc.
Os títulos do DbGrid você pode mudar pela estrutura do form (Structure) localizado no canto superior esquerdo, como você pode ver na figura acima, lá estará o grid e os campos dele, você seleciona o campo e muda o caption dele para o que achar melhor.
Agora no evento click do botão Incluir coloque o seguinte comando dm.cds_clientes.Append; , toda vez que o botão incluir for clicado ele criará um registro novo na tabela.
No botão Alterar coloque dm.cds_clientes.Edit; , com esse comando o registro que você selecionar no grid, será mostrado nas dbedit's e poderá ser alterado.
No botão Gravar coloque dm.cds_clientes.ApplyUpdates(0); , esse botão servirá tanto para gravar a inclusão dos registros novos quanto para gravar alterações, o (0) , significa que se tiver algum erro que o firebird detect nas informações ele não vai gravar.
No botão Excluir coloque dm.cds_clientes.Delete; e dm.cds_clientes.ApplyUpdates(0); , assim você deleta o registro e grava a alteração do banco.
E no Cancelar dm.cds_clientes.cancel; .
Pronto nosso cadastro está pronto, a rotina é a seguinte, para incluir registros novos, você clica no botão Incluir, Digita as informações e depois clica no botão Gravar, para alterar, selecione o registro no grid e clique no botão Alterar, Modifique o que for necessário e clique no botão Gravar, para excluir, selecione o registro no grid e clique no botão Excluir e se você clicou em Incluir ou Alterar e deseja cancelar a operação, clique no botão Cancelar.
Foi simples não foi ?
Lembrando que essa aplicação é apenas para que você entenda como é a comunicação do Delphi com o firebird, e como usar o modulo, agora cabe a você deixar essa aplicação utilizavél, pois não foi feito nenhum tratamento de erro nesse form, nenhuma verificação ele está praticamente cru.... ;).
futuramente colocarei projetos mais completos.
Boa Sorte !!!!

quarta-feira, 27 de maio de 2009

Começando com Delphi/Firebird

Antes de tudo queria lembrar a todos que esse blog é para iniciantes, então vou explicar tudo nos miiiiinimos detalhes, mas se tiver informações que pessoas mais experientes necessitam, fiquem a vontade..rs.
Aqui vou eu para minha primeira postagem, começarei com Delphi 2007 e Firebird, não posso dizer se o Delphi melhorou ou piorou, pois nunca usei versões anteriores, mas posso dizer que gostei bastante da linguagem e não tive muitos problemas com essa versão (apesar de não usar muito do potencial dela) e o velho e conhecido Firebird dispensa comentários.
Partirei do principio que você já criou seu banco no firebird com suas tabelas devidamente relacionadas, e um projetinho VCL Forms no Delphi para os testes (em uma outra postagem faço esse processo passo a passo).
Antes de tudo copie a dll fbclient (C:\Program Files\Firebird\Firebird_2_1\bin\fbclient.dll), para a pasta do seu projeto, assim você evita problemas de incompatibilidade de versões do firebird, só ai você cria o banco e expecifica que vai usar a fbclient que está dentro da pasta do projeto, já dentro do Delphi com seu projeto aberto, crie um data module, lá vão ficar todas as suas conexões para que você não deixe elas espalhadas pelos forms e depois fique perdido ( já passei por isso...rsrs).
Click com o botão direito do mouse no seu projeto selecione add new - Other..., como mostra a figura abaixo



Depois disso selecione a opção Data Module, será criada uma Unit pra você que é seu Módulo, na propriedade name dele, dê o nome que você quiser, eu costumo usar "dm".
Agora com seu módulo criado vá na palheta dbExpress e coloque no seu módulo um SQLConnection, e dê o nome que você quiser pra ele, eu deixo SQLConnection1 mesmo pois só uso um por projeto, dê dois click's no SQLConnection e adicione uma conexão, clicando no sinalzinho dê '+' , na tela que vai abrir selecione o Driver Name como Interbase e no Connection Name dê o nome que quiser (de preferência que tenha a ver com a aplicação) e OK, sua conexão já está na listas de conexões do seu SQLConnection, selecione ela e nas opções do lado direito vá em Database, lá coloque o caminho do seu banco, na frente do caminho coloque a palavra "localhost:" para evitar alguns probleminhas de conexão (lógico que isso vc coloca se seu banco for local), agora teste a conecção, ele vai pedir login e senha, coloque o padrão do firebird, ou o que você especificou na hora de criar o banco, se o teste deu OK, pode dar um OK nessa tela e sua conexão com o banco está pronta, mude a opção LoginPrompt do seu SQLConnection para false, se não ele vai ficar pedindo login e senha toda hora.
Agora vamos trazer os dados das tabelas para o projeto, coloque no seu módulo um SQLQuery da palheta dbExpress, um dataSetProvider da palheta Data Access, um ClientDataSet da palheta Data Access e um DataSource tb da palheta Data Access. Não se assuste com a quantidade de componentes, com o tempo eles aumentam...rsrs, você pode fazer a conexão via código, mas se for fazer assim eu sugiro usar o Csharp, o Dephi costumo usar para aplicações que preciso terminar logo e que sejam simples, quando preciso de algo mais elaborado uso o Csharp, depois postarei como fazer uma aplicação em camadas no Csharp.
Voltemos ao projeto, primeiro mude os nomes dos componentes, como bom costume use as siglas padrões para cada um deles, assim qualquer programador que olhar seu código, vai entender melhor, vou usar como exemplo uma conexão com uma tabela chamada clientes:
SQLQuery = qry_clientes
dataSetProvider = dsp_clientes
ClientDataSet = cds_clientes
DataSource = ds_clientes
Passarei a usar essas siglas a partir de agora, o primeiro que vamos mexer é o qry_clientes, na opção SQLConnection dele você seleciona o SQLConnection que criamos, deve estar com o nome "SQLConnection1", agora dê dois cliques na opção SQL, irá abiri um editor para você digitar o comando SQL, como queremos todos os campos da tabela digitq "Select * from Clientes" (sem as "" e com o nome da sua tabela no lugar de "Clientes"), agora mude a opção Active para true, se você fez tudo certinho ele mudará na boa, se não vai dar algum erro, ai você revisa tudo que fez até agora para achar o erro, agora com o qry_clientes ativado dê dois cliques no componente, na telinha que vai abrir clique com o botão direito do mouse e selecione a opção Add all fields, e todos os campos da sua tabela estarão disponíveis para serem utilizados, mas antes temos que configurar os outros componentes, para usarmos seus métodos.
Selecione seu dsp_clientes, na propriedade DataSet coloque o qry_clientes, agora selecione o cds_clientes, na propriedade ProviderName selecione o dsp_clientes, mude a propriedade Active para true, dê dois cliques no componente e selecione Add all fields, igual você fez com qry_clientes, agora selecione o ds_clientes, na propriedade DataSet dele selecione o cds_clientes e pronto, com todos eles ligados e funcionando, seu banco e sua tabela estão conectadas no seu projeto, agora repita o procedimento para cada tabela que for usar, e procure deixar os componetes na ordem das conexões dentro do módulo, para ficar mais facil de lembrar como conecta depois, com o tempo você acaba decorando...rsrs, vou colocar abaixo um print de um módulo meu para vocês verem a ordem:



espero ter ajudado alguém...rsrs....na próxima postagem mostrarei como gravar, alterar e excluir os dados do banco.
Qualquer dúvida deixe um recado com seu e-mail que eu entro em contato assim que possível.