Ir para conteúdo
Fórum Script Brasil

Duduh_Capixaba

Membros
  • Total de itens

    258
  • Registro em

  • Última visita

Sobre Duduh_Capixaba

  • Data de Nascimento 23/02/1983

Contatos

  • MSN
    epagoto@hotmail.com
  • Website URL
    http://
  • ICQ
    0

Perfil

  • Gender
    Male
  • Location
    Venda Nova do Imigrante - ES
  • Interests
    Programação

Últimos Visitantes

1.979 visualizações

Duduh_Capixaba's Achievements

0

Reputação

  1. Então, Rangel, são muitos passos a seguir. Inclusive vou te dar outra dica mais preciosa ainda: antes de começar seu projeto, procure no seu Estado sobre a homologação do seu software. Não é querendo te desanimar não, amigo, mas homologação é um teste de fogo pra qualquer programador, desde iniciantes até os mais experientes. Já participei de alguns testes de homologação e posso te dizer que não é nada fácil. Seu software vai ter que passar por uma bateria de testes muito rígida, pode se preparar. E o ideal é que você modele a base de dados pra atender a todas as leis e exigências da homologação, como PAF ECF, TEF, NF-e, e etc, etc. Bom trabalho e boa sorte. Abraço
  2. Amigo, tudo isso que você perguntou é muito flexível, variável, não existe uma ÚNICA resposta para cada pergunta que fez. Questão 1: você tem que ter em mente como seu aplicativo vai ser usado, se vai ser aplicação desktop, web, qual o volume de dados que vai trafegar, se vai ser multi usuário, blá, blá, blá... E por aí vai. Não adianta você querer implantar uma base de dados Firebird em um sistema que vai gerar gigas de informação por dia, porque ele não vai dar conta. Questão 2: Não tem um padrão pra isso. Já trabalhei em vários programas, e cada um tinha seu modo de armazenar os dados. Fica a seu critério achar um modo que seja mais fácil pra você manipular os dados. Questão 5: Se der uma olhada pela net, vai ver que a maioria dos sistemas passam por problemas com desenvolvimento de relatórios. Existem muitas ferramentas no mercado, cada uma tenta dar uma solução diferente. O ideal é você pegar uma empresa já conhecida, como o FastReport, onde você saiba que o projeto deles não vai morrer tão cedo, e você vai ter atualizações e suporte por um bom tempo, com um preço justo, e aprender como a ferramenta funciona e focar nela. Questão 6: Bem, eu nunca abri uma empresa, mas se fosse abrir iria até o SEBRAE pra me informar sobre minha área de atuação. Leis e legislações é com você mesmo! É pegar o manual do assunto, por exemplo a NF-e, ler e entender. O que você pode fazer é abrir uma parceria com alguma empresa voltada pro assunto. No caso da NF-e, uma empresa de contabilidade te ajudaria muito. Uma dica: se o projeto é realmente gigante, como você mesmo disse, não comece sozinho. Tenha mais alguém no grupo, pois muitas dúvidas vão surgir e você vai precisar de ajuda. E informe-se bem sobre tudo. Começar o projeto, se arrepender de como algo foi construído e tentar reverter é osso. Um programa tem que ser muito bem planejado no papel antes de ir pras linhas de programação.
  3. Olá, Micheus! Muito obrigado por sua explicação, me esclareceu muita coisa. Bem, pelo visto não tenho mesmo outro caminho, senão o GetClass. Eu estava estudado sobre OO e agora percebo com mais clareza sua explicação. A minha ideia era customizar o código. Iria criar uma procedure para chamar as telas. Mas com o GetClass eu consegui o que queria, e acho que vou fechar mesmo nessa ideia. Muito obrigado, e até a próxima!
  4. Olá Jhonas! Primeiramente obrigado pela resposta. Bem, eu rodei o exemplo CLASSREF, que é muito interessante. Já havia visto um exemplo parecido com esse, onde um formulário é criado antes dos outros objetos, código cedido pelo Micheus no forum da DevMedia. Os dois códigos me deram uma boa noção do que fazer, mas ainda não consegui chegar a uma solução. Deixe-me explicar melhor o problema: Tenho um projeto com vários formulários criados em modo de design. TfrmTela1, TfrmTela2, TfrmTela3, TfrmTela4... TfrmTela700. Esses formulários NÃO são criados na inicialização do aplicativo. Eles são criados à medida que são chamados no projeto, e depois liberados da memória quando fechados. Ex.: O cliente clica no menu pra chamar o formulário 1: Application.CreateForm(TfrmTela1, frmTela1); frmTela1.Show; Quando ele fecha o formulário 1, o mesmo é liberado com um "Action := caFree". Ok! Tudo perfeito. Agora vamos à minha idéia... O que eu quero é o seguinte: passar para o código "Application.CreateForm(TfrmTela1, frmTela1)" parâmetros STRING. No caso, ficaria: Application.CreateForm('TfrmTela1', 'frmTela1'). Por quê isso? Porque eu tenho em minha base de dados o nome de cada formulário do projeto. Sendo assim eu criaria uma procedure para criar os formulários buscando seu nome na base de dados. Eu até consegui esse feito usando o código que coloquei no primeiro post. Mas esse código tem um porém: eu preciso usar o comando "RegisterClass() e UnregisterClass()" em cada formulário, ou seja, teria que passar form por form (mais de 700) incluindo essas duas linhas de comando com o nome do formulário. Ou ainda, no formulário principal do projeto, registrar todos os forms de uma vez só e em seguida desregistrar, tendo que digitar mais de 1500 linhas de código. E ainda por cima ter que incluir duas novas linhas no form principal a cada novo form inserido no projeto. Gostaria de uma solução sem ter que utilizar o GetClass(), RegisterClass() e UnregisterClass(). Se tiver uma luz de como fazer isso me avise. Abraço
  5. Olá a todos! Estou criando formulários em tempo de execução da seguinte forma: busco em minha base de dados o nome do formulário a ser criado e coloco em uma variável String. Abaixo está o código que estou usando. procedure TForm1.Button1Click(Sender: TObject); var vcls_form: TPersistentClass; vobj_form: TForm; nome_form: String; begin RegisterClass(TfrmTela1); RegisterClass(TfrmTela2); nome_form := tblFORM.FieldByName('DESCRICAO').AsString; vcls_form := GetClass(nome_form); if (Assigned(vcls_form)) and (vcls_form.InheritsFrom(TForm)) then begin vobj_form := TFormClass(vcls_form).Create(Self); vobj_form.Show; end; end; Com a String preenchida com o nome do form consigo criar o objeto sem problemas, mas com um porém: preciso registrar cada classe antes do comando GetClass, ou seja, cada nome de formulário existente no projeto. No meu teste registrei dois formulários: TfrmTela1 e TfrmTela2, mas em meu projeto tenho mais de 700 forms. Não gostaria de escrever essas 700 linhas, e nem ter que adicionar mais uma linha quando um novo form for adicionado ao projeto. Alguém teria uma outra idéia de como criar um obeto, passando como parâmetro uma variável String, sem ser necessário registrar classe por classe?
  6. Opa, voltando com a solução! Sim, é possível fazer um UPDATE com um GENERATOR sequenciando um campo. Vejamos como: No meu caso, minha tabela se chama ESMVSAI1, e suas chaves primárias são FILIAL, ORDEM e ITEM. Pegando o exemplo que eu dei acima: FILIAL | ORDEM | ITEM 1 | 10 | 1 1 | 10 | 2 1 | 10 | 4 E aplicando essa SQL: UPDATE ESMVSAI1 T1 SET T1.ITEM = ( SELECT FIRST(1) GEN_ID(NOME_DO_GENERATOR, 1) FROM ESMVSAI1 T2 WHERE T2.FILIAL = T1.FILIAL AND T2.ORDEM = T1.ORDEM AND T2.FILIAL = 1 AND T2.ORDEM = 10 ) WHERE T1.FILIAL = 1 AND T1.ORDEM = 10 Temos como resultado: FILIAL | ORDEM | ITEM 1 | 10 | 1 1 | 10 | 2 1 | 10 | 3 Lembrando de zerar seu GENERATOR sempre antes de aplicar essa SQL. Para zerar: SET GENERATOR NOME_DO_GENERATOR TO 0 Espero que ajude mais alguém. Vlw vlw! Eduardo Pagoto
  7. Olá povo! Busquei na internet e não encontrei uma forma de fazer o que preciso. É o seguinte: Tenho uma tabela de movimentação de produtos, onde gravo seu código e seu número sequencial na ordem em que ele é inserido, mais ou menos assim: ITEMSEQ | CODPROD 1 | 32 2 | 401 3 | 5 4 | 16 Acontece que se o usuário deletar um desses itens inserido na tabela a ordem pode ser comprometida com a falta de um número sequencial, assim: ITEMSEQ | CODPROD 1 | 32 2 | 401 4 | 16 Haveria um modo de eu dar um UPDATE nessa tabela para refazer a ordem dos números? No meu exemplo acima, o último item (4) ficaria sendo 3. Minha ideia era usar um GENERATOR junto com o UPDATE, mas acontece que eu receberia mais de um registro por vez e não daria certo. Alguém tem alguma outra ideia?
  8. Resolvi meu problema com um Cabeçalho de Grupo setado com a tabela mestre e um MasterData setado com a tabela detalhe. No Cabeçalho de grupo tive que ativar a propriedade ReprintOnNewPage. Problema resolvido!
  9. Leve engano meu...! O cabeçalho e rodapé vem sim, consegui fazer o relatório do cadastro de produtos. Agora, um problema um pouco mais difícil, dados em Mestre/Detalhe: Quero fazer o relatório de movimentação de vendas da mesma forma que o cadastro de produtos, só que com duas tabelas diferentes: Tabela MOV1 - cabeçalho da venda; Tabela MOV2 - itens da venda; Então, quando a banda dos itens atingir 10 registros, o Fast pularia pra próxima página, levando junto os dados do cabeçalho (MOV2).
  10. Consegui uma leve evoluída. Dentro do Fast criei o seguinte código no evento da banda: procedure MasterData1OnBeforePrint(Sender: TfrxComponent); begin MasterData1.StartNewPage := <Line> mod 20 = 0; end; Mas o problema é que o Fast só imprime a banda com os registros, deixando para trás o cabeçalho e o rodapé do relatório. Mas acredito que o caminho seja este. Continuo na luta!
  11. Olá pessoas! Estou começando a utilizar o FastReport, tenho um conhecimento básico sobre ele. Meu problema é o seguinte... Eu preciso limitar a quantidade de registros impressos por página. Um exemplo simples: meu cadastro de produtos possui 560 registros, e eu gostaria de imprimir 20 registros em cada página, ou seja, assim que a banda atingir a linha número 20, o Fast pulasse para a próxima página. Então eu teria 28 páginas no total (560 / 20 = 28). Seria possível isso?
  12. Aê galera, voltando com a resposta... Bem, o Firebird 1.5 não tem uma função pra quebra de linha, então, o que eu fiz foi inserir uma função na minha base de dados. Função esta que está incluída na DLL ib_udf.dll, que já vem na instalação do próprio Firebird (pasta UDF), ou seja, se vc usa a versão 1.5 do FB, basta declarar a função e usá-la, pois a DLL já está onde deve estar. Prosseguindo, a função que faz a quebra é esta: DECLARE EXTERNAL FUNCTION ascii_char INTEGER RETURNS CSTRING(1) FREE_IT ENTRY_POINT 'IB_UDF_ascii_char' MODULE_NAME 'ib_udf'; Você encontra esta função dentro do arquivo ib_udf.sql (linha 60). Depois de incluída, usamos assim: 'linha1' || ascii_char(13) || 'linha2' Pronto, resolvido! Só não entendi porque raios as funções da biblioteca ib_udf.dll já não vem como padrão... Problema resolvido, o tópico pode ser fechado.
  13. Olá delphianos! Estou com um problema que a princípio parece não ter solução, pois pesquisei bastante na internet e me deparei com negativas. É o seguinte... Uma das tabelas de minha base de dados Firebird possui um campo BLOB SUB_TYPE 1. Ligando esta tabela a um TTable (BDE) e setando o campo HISTORICO (campo BLOB) a um DBMemo, consigo visualizar e gravar os informações na base tranquilamente. Mas o mesmo não ocorre se eu usar uma QUERY. O SELECT funciona tranquilo, me mostra todos os dados da tabela, inclusive do campo HISTORICO. Agora, se tento fazer um INSERT usando SQL, o Delphi me retorna uma mesagem de erro para o campo BLOB: "General SQL Error. Feature is not supported. BLOB and array data types are not supported for move operation." Isso quer mesmo dizer que não consigo inserir dados texto em um BLOB SUB_TYPE 1? Tentei inserir diretamente pelo IBExpert substituindo os parâmetros por texto e deu certo, mas aí eu não consigo inserir as quebras de linha que o componente MEMO me proporciona, tendo que juntar o texto todo em uma linha só. Alguém pode me sar uma idéia? Preciso realmente inserir dados nessa tabela usando SQL, pois é onde gravo as configurações do meu sistema, e quando acontece um problema em um cliente, já teria a SQL de inserção pronta pra rodar, mas o campo histórico precisaria entrar tb.
  14. Bem, postando nesse tópico apenas para fins de informação para quem procurar algo parecido. Não sei se ninguém respondeu por não saber como resolver ou se foi por eu não ter sido claro o bastante. Peço desculpas por não ter voltado aqui antes para postar a resposta, pois estava muito atarefado. Bem, o que eu queria era mostrar um resultado com a soma de um campo com diferentes condições WHERE. Então, se estou somando o campo LIQUIDO com duas condições diferentes, ele deve aparecer no resultado duas vezes. Tomando por base o mesmo exemplo que deixei acima, o SELECT ficaria assim: SELECT CLIENTE, (SELECT SUM(LIQUIDO) FROM CRDOCUME WHERE VENCIMENTO < '03/26/2010' AND CLIENTE = 9) AS VENCIDO, (SELECT SUM(LIQUIDO) FROM CRDOCUME WHERE VENCIMENTO >= '03/26/2010' AND CLIENTE = 9) AS VENCER FROM CRDOCUME WHERE CLIENTE = 9 GROUP BY CLIENTE E o resultado: CLIENTE | VENCIDO | VENCER 9 | 50,00 | 40,00 Ou seja, um select dentro de outro select, mostrando o mesmo campo com resultados diferentes. Qualquer dúvida podem me mandar uma MP. Tópico resolvido, podem fechar!
  15. Olá povo! Tenho os seguintes dados em uma tabela: CLIENTE | DOCUMENTO | VENCIMENTO | LIQUIDO 9 | D01 | 25/01/2010 | 15,00 9 | D02 | 04/02/2010 | 10,00 9 | D03 | 01/03/2010 | 25,00 9 | D04 | 05/05/2010 | 40,00 Tendo como data atual 26/03/2010, então, o cliente 9 possui: documentos vencidos: 50,00 documentos a vencer: 40,00 Gostaria de uma SELECT onde eu obtivesse as duas somas em CAMPOS DIFERENTES, e apenas UM REGISTRO, assim: CLIENTE | VENCIDO | VENCER 9 | 50,00 | 40,00 O mais próximo que cheguei foi: SELECT SUM(LIQUIDO) AS VENCIDO FROM CRDOCUME WHERE CLIENTE = 9 AND VENCIMENTO < '03/26/2010' UNION SELECT SUM(LIQUIDO) AS VENCER FROM CRDOCUME WHERE CLIENTE = 9 AND VENCIMENTO >= '03/26/2010' Só que o resultado é retornado em UM CAMPO (VENCIDO) contendo DOIS REGISTROS, um com a soma dos documentos vencidos, outro com a soma dos documentos a vencer. Outra select bem próxima foi: SELECT DISTINCT(CLIENTE), CASE WHEN VENCIMENTO < '03/26/2010' THEN (SELECT COALESCE(SUM(LIQUIDO), 0) FROM CRDOCUME WHERE VENCIMENTO < '03/26/2010' AND CLIENTE = 9) END AS VENCIDO, CASE WHEN VENCIMENTO >= '03/26/2010' THEN (SELECT COALESCE(SUM(LIQUIDO), 0) FROM CRDOCUME WHERE VENCIMENTO >= '03/26/2010' AND CLIENTE = 9) END AS VENCER FROM CRDOCUME WHERE CLIENTE = 9 Este resultado me retorna OS DOIS CAMPOS, VENCIDO e VENCER, mas também traz DOIS REGISTROS. Será que alguém consegue resolver este problema? Vlw vlw
×
×
  • Criar Novo...