Ir para conteúdo
Fórum Script Brasil

Duduh_Capixaba

Membros
  • Total de itens

    258
  • Registro em

  • Última visita

Posts postados por Duduh_Capixaba

  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. 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).

  9. 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!

  10. 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?

  11. 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.

  12. 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.

  13. 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!

  14. 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

  15. Novamente agradeço a ajuda e o interesse Jhonas, mas, perceba

    que isso é só um exemplo. Eu tenho "N" possibilidades de cancelamentos.

    Um único cupom fiscal pode ter "N" itens, e desses, qualquer um deles

    pode estar cancelado, ou seja, o filtro "AND ITEM = X" deve apontar para

    o(s) item(ns) cancelado(s).

    Eu já resolvi esse problema via programação. Separei os itens cancelados

    em outra tabela, e agora posso controlá-los mais facilmente. Mas fica o

    desafio aí, pra quem quiser se aventurar.

    Abraço, e obrigado!

  16. Obrigado pela resposta Jhonas, mas é um pouco mais complicado que isso.

    Não sei se você leu todo o primeiro post, mas eu tenho que excluir os itens

    cancelados, ou seja, os registros que contém a letra "C" em ALIQCST e tb

    os registros que se referem a ele. Meio confuso né?! Deixa eu explicar com

    um exemplo...

    DATA | COO | ITEM | MATRIC | QUANT | VRUNIT | VRLIQUIDO | ALIQCST

    02/10/2009 | 000003 | 001 | 000023 | 1,00 | 0,99 | 0,99 | T

    02/10/2009 | 000003 | 002 | 005009 | 3,00 | 1,50 | 4,50 | T

    02/10/2009 | 000003 | 003 | 000211 | 2,00 | 0,50 | 1,00 | T

    02/10/2009 | 000003 | 003 | 000211 | 2,00 | 0,50 | 1,00 | C

    Estes dados se referem a um cupom (COO = 3), onde o item 3 foi cancelado.

    Perceba que estou falando do item 3, ITEM = 003, e não do 3º registro, ok?!

    Bem, então, nesse exemplo, eu teria que excluir o 3º e o 4º registros. porque?

    porque como o 4º registro me informa que o item 3 foi excluido, então eu não

    posso somar nem o valor do registro 3, nem do 4. Apenas os itens 1 e 2

    foram impressos pela impressora fiscal, totalizando R$ 5,49.

  17. Descobri que eu posso deletar os ítens cancelados da base de dados.

    Nesse caso, como faria para deletar os registros 3 e 4 desse exemplo?

    02/10/2009 | 000003 | 001 | 000023 | 1,00 | 0,99 | 0,99 | T

    02/10/2009 | 000003 | 002 | 005009 | 3,00 | 1,50 | 4,50 | T

    02/10/2009 | 000003 | 003 | 000211 | 2,00 | 0,50 | 1,00 | T

    02/10/2009 | 000003 | 003 | 000211 | 2,00 | 0,50 | 1,00 | C

  18. É, tá muito complicada essa Query...! Tentei fazer o seguinte...

    Criei mais uma consulta e modifiquei a primeira, ficando assim:

    1a query:

    SELECT DATA, COO, ITEM, VRLIQUIDO FROM SIN60I WHERE DATA = :DATA
    ORDER BY DATA, COO, ITEM
    assim, eu trago a soma de todos os ítens, inclusive os cancelados. 2a query:
    SELECT DATA, COO, (SUM(VRLIQUIDO) - (SELECT SUM(VRLIQUIDO) FROM SIN60I WHERE COO = :COO
      GROUP BY COO, ITEM, VRLIQUIDO
      HAVING COUNT(ITEM) > 1)) AS TOTAL FROM SIN60I WHERE COO = :COO
    GROUP BY DATA, COO

    isto deveria me trazer a diferença da soma dos ítens não cancelados

    com os cancelados, mas quando ligo a Grid ao Data Source, não aparece

    nada :( Se eu coloco um nro de cupom existente no lugar do parâmetro

    do subselect, aí dá certo, mas fico com um nro fixo.

    Estou chegando perto, mas tá complicado.

  19. Olá pessoas!

    Estou querendo mostrar dois resultados, em dois grids, pegando

    dados da mesma tabela. Vamos lá!

    Os campos que eu tenho na tabela são: DATA, COO, ITEM, MATRIC, QUANT, VRUNIT, VRLIQUIDO, ALIQCST

    e referem-se a cupons fiscais. Os dados estão gravados na tabela no seguinte modo:

    01/10/2009 | 000001 | 001 | 000010 | 1,00 | 1,50 | 1,50 | T

    01/10/2009 | 000001 | 002 | 000055 | 2,00 | 1,50 | 3,00 | T

    01/10/2009 | 000002 | 001 | 000110 | 1,00 | 0,50 | 0,50 | T

    02/10/2009 | 000003 | 001 | 000023 | 1,00 | 0,99 | 0,99 | T

    02/10/2009 | 000003 | 002 | 005009 | 3,00 | 1,50 | 4,50 | T

    02/10/2009 | 000003 | 003 | 000211 | 2,00 | 0,50 | 1,00 | T

    03/10/2009 | 000004 | 001 | 000010 | 1,00 | 1,99 | 1,99 | T

    02/10/2009 | 000003 | 003 | 000211 | 2,00 | 0,50 | 1,00 | C

    onde C, no campo ALIQCST, significa que o item do cupom foi cancelado,

    e o T, a sua situação tributária.

    Na primeira query, minha SQL ficou da seguinte forma:

    SELECT DATA, COO, SUM(VRLIQUIDO) AS TOTAL FROM SIN60I WHERE DATA = :DATA AND ALIQCST <> "CANC"
    GROUP BY DATA, COO
    Ela soma o valor total dos itens, agrupando os resultados por data e cupom, simulando o total geral do cupom fiscal. Na segunda query eu mostro os itens do cupom, assim:
    SELECT COO, ITEM, MATRIC, QUANT, VRUNIT, VRLIQUIDO, BASEICMS,
    VRICMS FROM SIN60I WHERE COO = :COO
    GROUP BY COO, ITEM, MATRIC, QUANT, VRUNIT, VRLIQUIDO, BASEICMS,
    VRICMS
    HAVING COUNT(ITEM) = 1

    O problema está na primeira query. Ela deixa de somar o cupom com situação

    C, correto, mas ela tb deveria não somar o item que está cancelado. Pegando

    como base o exemplo acima:

    02/10/2009 | 000003 | 001 | 000023 | 1,00 | 0,99 | 0,99 | T

    02/10/2009 | 000003 | 002 | 005009 | 3,00 | 1,50 | 4,50 | T

    02/10/2009 | 000003 | 003 | 000211 | 2,00 | 0,50 | 1,00 | T

    02/10/2009 | 000003 | 003 | 000211 | 2,00 | 0,50 | 1,00 | C

    a soma disso tudo dá: 7,49. O resultado da minha SQL mostra: 6,49.

    Mas o valor correto a mostrar seria: 5,49, pois apenas os itens 1 e 2

    foram realmente impressos, o 3 foi cancelado, mas é exibido duas

    vezes. A segunda SQL está correta, ela mostra apenas os itens que

    realmente foram impressos, isso porque eu exibo apenas os itens que,

    somados, tem valor igual a 1. Já na primeira SQL eu não tenho como

    usar este atributo, pois os itens não podem aparecer na consulta.

    Já tentei várias formas de solucionar o problema, com vários selects

    diferentes, mas sem muito sucesso. Vou continuar tentado, enquanto

    aguardo uma ajuda.

  20. Só passando pra dizer que encontrei uma UDF (tbudf) com muitas funções interessantes, inclusive,

    a que parcialmente resolveu meu problema. Consegui o que eu queria, mas meu chefe não gostou

    muito da idéia de ter que atualizar as bases de dados de todos os clientes =\ e preferiu a ferramenta

    que desenvolvi no Delphi, que lê registro por registro.

    Aceito outras sugestões.

  21. Olá pessoal!

    Procurei bastante na internet sobre funções de manipulação de strings no Firebird,

    mas só consegui encontrar procedures feitas por terceiros. Eu gostaria de trabalhar

    com comandos nativos do Firebird (versão 1.5). Eis minha questão:

    Tenho em minha base de dados uma tabela de clientes, e dentro dela um campo

    CNPJ_CPF. Nesse campo, possuo lançamentos de dados de várias formas, exemplos:

    CPF: 000.111.222-33, 000111222-33, 00011122233

    CNPJ: 00.111.222/3333-44, 00111222/3333-44, 001112223333-44, 00111222333344

    Agora entra a questão. Eu gostaria de identificar o que é CPF e o que é CNPJ, para jogar

    para o meu novo campo NAT_JURIDICA um valor que identifique se o cliente é Pessoa

    Física ou Jurídica. Pensei em extrair apenas os números do campo CNPJ_CPF e fazer a

    seguinte comparação:

    SE TOTAL STRING DE CNPJ_CPF = 11 então CPF (NAT_JURIDICA = F)

    SE TOTAL STRING DE CNPJ_CPF = 14 então CNPJ (NAT_JURIDICA = J)

    Sei fazer isso pelo Delphi, já está até funcionando. Mas o problema é que eu tive que fazer

    um loop, lendo registro por registro. E numa base de dados com muitos registros, fica um

    pouco demorado de fazer esse processo.

    Sempre faço essas atualizações na base via SQL, mas me deparei com o problema de o meu

    campo CNPJ_CPF aceitar qualquer tipo de caracter, e não conheço uma função do Firebird que

    me permita excluir caracteres de uma string.

    Vou tentar resolver de outras formas enquanto aguardo a ajuda de um colega.

    Abraço a todos

  22. Agora, outra coisa que esqueci de pedir...

    Como faço para transformar uma string:

    "C:\Pasta\Arquivo.ext"

    para:

    "\\estacao\C\Pasta\Arquivo.ext"?

    Sei que o Delphi tem um comando para pegar apenas parte de uma string, mas não faço idéia que qual seja. Assim, sendo que eu possuo o valor "\\estacao" em outra variável, bastaria tirar o ":".

    ------------------------------------------------------------------

    Edição:

    Consegui com o SelStart e SelLength. Obrigado!

×
×
  • Criar Novo...