none
LER ARQUIVO *.TXT E SEPARAR REGISTROS INTEGRADOS RRS feed

  • Pergunta

  • Boa tarde Pessoal.

    Estou com uma certa dificuldade em trabalhar com o arquivo SPED FISCAL (*.txt).

    Já consigo ler o arquivo *.txt e separar seus registros em listas. Minha dificuldade aqui é a seguinte. Tendo por base o layout demonstrado nas linhas abaixo, tentarei explicar o que preciso:

    |C100|0|1|9|55|00|2|7447|51190505031151000120550020000074471490694475|06052019|12052019|303,8|0|0||303,8|0|||0|0|0||||||||
    |C170|1|29||217|UN|303,8|0|0|060|1403||||0||||||||||01||||||01||||||||
    |C190|060|1403||303,8|0|0|0|0|0|0||

    O tipo do registro, é informado dentro do primeiro conjunto de chaves delimitado por "|". Dito isso, o registro C100 é responsável pelos dados da nota fiscal, o registro C170 é responsável pelos dados dos itens dessa nota fiscal e o registro C190 é responsável pelos dados sumarizados por CST e CFOP (somando os valores totais de cada item) dos itens desta nota.

    Minha dúvida é, como fazer para adicionar um registro C100 em uma lista, e fazer com que o seu respectivo registro C190 adicionado em outra lista, esteja ligado ao seu respectivo registro C100?

    Tendo em vista que consigo armazenar os registros separados nas listas, porém não consigo vincular um ao outro.



    • Editado JehanKheller terça-feira, 9 de julho de 2019 19:22
    terça-feira, 25 de junho de 2019 20:18

Respostas

  • É verdade, tem um problema aí que eu não tinha percebido.
    Não está carregando porque o código abaixo está dentro do foreach. Aí ele sempre vai limpar o NUM_DOC:

    #region Instâncias Bloco C
    BlocoC.RegistroC100 registroC100 = new BlocoC.RegistroC100();

    Para resolver isso você pode jogar essa linha antes do foreach (mas aí tem que verificar se não vai ficar dados desnecessários a cada iteração), ou criar uma variável fora do foreach para armazenar o NUM_DOC, e preenche-la junto com o registroC100.

    [...]
    
    //Cria a variável que vai guardar o numero do documento.Ela vai manter o numero até encontrar outro registro C100
    string numDoc = ""; 
    foreach (var item in arquivoSped)
    
    [...]
    
    registroC100.NUM_DOC = linha[8]; // Aqui você já preenche o numero do documento no objeto registroC100.NUM_DOC 
    numDoc = registroC100.NUM_DOC    // Só vai armazenar na variável também
    
    [...]
    
    // Aqui você ao invés de pegar o número direto do objeto dessa forma
    registroC190.RegistroC100.NUM_DOC = registroC100.NUM_DOC; 
    
    //Pegue da variável. Substitua essa linha por:
    registroC190.RegistroC100.NUM_DOC = numDoc ; 

    Acredito que dessa forma irá funcionar.

    • Marcado como Resposta JehanKheller quinta-feira, 12 de dezembro de 2019 01:41
    terça-feira, 10 de dezembro de 2019 20:02

Todas as Respostas

  • Ninguém do fórum consegue me ajudar?

    Infelizmente esse é um problema que eu já estou tentando resolver a muito tempo. Alguém consegue me dar uma ajuda?

    quinta-feira, 5 de setembro de 2019 11:38
  • Amigo, se entendi bem você precisa pegar o registro C190 de uma lista que se refere a um C100 da outra lista, correto?
    Na documentação referente a esse arquivo de layout tem alguma informação de qual o identificador que informa que aquele C190 é de C100 que esta em outra lista?
    Porque é a partir disse que da pra montar uma solução!
    quinta-feira, 5 de setembro de 2019 14:26
  • Bom dia Luciano.

    Obrigado por responder e mil perdões pela demora.

    Não, na documentação não tem esta informação, contudo, eu poderia informar no registro C170 e C190 o número do documento. Porém, eu não consigo achar a lógica para que, ao percorrer as linhas, ele identifique que á registros abaixo do registro C100 e vincule.

    terça-feira, 1 de outubro de 2019 12:48
  • Bom dia.

    Alguém do fórum consegue me ajudar nessa questão?

    segunda-feira, 9 de dezembro de 2019 14:17
  • Boa tarde Jehan,

    Você já tem alguma lógica desenvolvida, ou alguma parte já me mente? Você diz que já consegue separar os dados em listas, então já existem 3 objetos um para armazenar os dados da nota, um para os itens e outro para os dados sumarizados certo?

    Uma lógica que eu pensei aqui foi de percorrer o arquivo linha a linha e quando encontrar um registros do tipo C100, armazenar um identificador único desse registro para poder fazer o vínculo. Pode ser até um código gerado por você mesmo ou um GUID.

    Continuar percorrendo as linhas e para os próximos registros do tipo C170 e C190, colocar o código único do identificador C100 que está armazenado em uma variável ou algo assim.

    O processo se repete até o fim do arquivo dentro do laço de repetição. Toda vez que acha um C100, armazena ou cria um código para vincular e atribui esse código nos próximos C170 e C190.

    É só uma ideia, talvez possamos amadurecer e montar um código pra isso.

    Aguardo Retorno.

    segunda-feira, 9 de dezembro de 2019 17:09
  • Boa tarde Jehan,

    Você já tem alguma lógica desenvolvida, ou alguma parte já me mente? Você diz que já consegue separar os dados em listas, então já existem 3 objetos um para armazenar os dados da nota, um para os itens e outro para os dados sumarizados certo?

    Uma lógica que eu pensei aqui foi de percorrer o arquivo linha a linha e quando encontrar um registros do tipo C100, armazenar um identificador único desse registro para poder fazer o vínculo. Pode ser até um código gerado por você mesmo ou um GUID.

    Continuar percorrendo as linhas e para os próximos registros do tipo C170 e C190, colocar o código único do identificador C100 que está armazenado em uma variável ou algo assim.

    O processo se repete até o fim do arquivo dentro do laço de repetição. Toda vez que acha um C100, armazena ou cria um código para vincular e atribui esse código nos próximos C170 e C190.

    É só uma ideia, talvez possamos amadurecer e montar um código pra isso.

    Aguardo Retorno.

    Bom dia João, obrigado por responder minha questão.

    Sim, já consigo separar as linhas de cada registro e já tentei de algumas formas fazer conforme a sua lógica de raciocínio, mas não encontrei a forma correta de fazer isso. E sim, esse seria o caminho viável para atender minha solicitação.

    O Registro C100 seria o "PAI" por assim dizer dos registros C170 e C190. A chave de identificação do registro C100 poderia ser o número da nota fiscal que seria o 8º campo, por exemplo:

    Nesta linha "|C100|0|1|9|55|00|2|7447|51190505031151000120550020000074471490694475|06052019|12052019|303,8|0|0||303,8|0|||0|0|0||||||||", o número da nota seria 7447, então, adicionando este número nos registros C170 e C190, eu conseguiria ligar um registro ao outro, porém, não tenho idéia de como fazer isso.

    Estes são os códigos que utilizo para percorrer o arquivo:

            private void CarregarDadosSpedFiscal()
            {
                #region Limpar Listas Bloco 0
                listaRegistro0000.Clear();
                listaRegistro0005.Clear();
                #endregion
    
                #region Limpar Listas Bloco C
                listaRegistroC100.Clear();
                listaRegistroC100_EntradaSaida.Clear();
                listaRegistroC190.Clear();
                listaRegistroC190_Entrada.Clear();
                listaRegistroC190_Saida.Clear();
                #endregion
    
                try
                {
                    // Retorna todas as linhas do arquivo em um array
                    // de string, onde cada linha será um índice do array
                    string[] arquivoSped = File.ReadAllLines(this.nomeArquivoSped);
    
                    // Percorre as linhas do arquivo
                    foreach (var item in arquivoSped)
                    {
                        #region Instâncias Bloco 0
                        Bloco0.Registro0000 registro0000 = new Bloco0.Registro0000();
                        Bloco0.Registro0005 registro0005 = new Bloco0.Registro0005();
                        #endregion
    
                        #region Instâncias Bloco C
                        BlocoC.RegistroC100 registroC100 = new BlocoC.RegistroC100();
                        BlocoC.RegistroC190 registroC190 = new BlocoC.RegistroC190();
                        #endregion
    
                        // Quebra a linhas nas 3 colunas necessárias
                        // a regra aqui é quebrar onde encontrar o |
                        string[] linha = item.Split('|');
    
                        #region Carregar dados nas listas do bloco 0
                        if (linha[1].ToString().Contains("0000"))
                        {
                            foreach (var linhaRegistro0000 in linha[1] = "0000")
                            {
                                registro0000.REG = linha[1];
                                registro0000.COD_VER = linha[2];
                                registro0000.COD_FIN = Convert.ToInt32(linha[3]);
                                registro0000.DT_INI = linha[4];
                                registro0000.DT_FIN = linha[5];
                                registro0000.NOME = linha[6];
                                registro0000.CNPJ = linha[7];
                                registro0000.CPF = linha[8];
                                registro0000.UF = linha[9];
                                registro0000.IE = linha[10];
                                registro0000.COD_MUN = int.Parse(linha[11]);
                                registro0000.IM = linha[12];
                                registro0000.SUFRAMA = linha[13];
                                registro0000.IND_PERFIL = linha[14];
                                registro0000.IND_ATIV = int.Parse(linha[15]);
    
                                listaRegistro0000.Add(registro0000);
                            }                        
                        }
                        if (linha[1].ToString().Contains("0005"))
                        {
                            foreach (var linhaRegistro0005 in linha[1] = "0005")
                            {
                                registro0005.REG = linha[1];
                                registro0005.FANTASIA = linha[2];
                                registro0005.CEP = linha[3];
                                registro0005.END = linha[4];
                                registro0005.NUM = linha[5];
                                registro0005.COMPL = linha[6];
                                registro0005.BAIRRO = linha[7];
                                registro0005.FONE = linha[8];
                                registro0005.FAX = linha[9];
                                registro0005.EMAIL = linha[10];
                            }
    
                            listaRegistro0005.Add(registro0005);
                        }
                        #endregion
    
                        #region Carregar dados nas listas do bloco c
                        if (linha[1].ToString().Contains("C100"))
                        {
                            foreach (var linhaRegistroC100 in linha[1] = "C100")
                            {
                                registroC100.REG = linha[1];
                                registroC100.IND_OPER = Convert.ToInt32(linha[2]);
                                registroC100.IND_EMIT = Convert.ToInt32(linha[3]);
                                registroC100.COD_PART = linha[4];
                                registroC100.COD_MOD = linha[5];
    
                                switch (linha[6])
                                {
                                    // 00 - Documento Regular
                                    // 01 - Documento Regular Extemporâneo
                                    // 02 - Documento Cancelado
                                    // 03 - Documento Cancelado Extemporâneo
                                    // 04 - NFe, NFC-e ou CT-e denegado
                                    // 05 - NFe, NFC-e ou CT-e Numeração inutilizada
                                    // 06 - Documento Fiscal Complementar
                                    // 07 - Documento Fiscal Complementar Extemporâneo
                                    // 08 - Documento Fiscal Emitido com Base em Regime Especial ou Norma Específica
    
                                    case "00":
                                        registroC100.COD_SIT = "00 - Documento Regular";
                                        break;
    
                                    case "01":
                                        registroC100.COD_SIT = "01 - Documento Regular Extemporâneo";
                                        break;
    
                                    case "02":
                                        registroC100.COD_SIT = "02 - Documento Cancelado";
                                        break;
    
                                    case "03":
                                        registroC100.COD_SIT = "03 - Documento Cancelado Extemporâneo";
                                        break;
    
                                    case "04":
                                        registroC100.COD_SIT = "04 - NFe, NFC-e ou CT-e denegado";
                                        break;
    
                                    case "05":
                                        registroC100.COD_SIT = "05 - NFe, NFC-e ou CT-e Numeração inutilizada";
                                        break;
    
                                    case "06":
                                        registroC100.COD_SIT = "06 - Documento Fiscal Complementar";
                                        break;
    
                                    case "07":
                                        registroC100.COD_SIT = "07 - Documento Fiscal Complementar Extemporâneo";
                                        break;
    
                                    case "08":
                                        registroC100.COD_SIT = "08 - Documento Fiscal Emitido com Base em Regime Especial ou Norma Específica";
                                        break;
                                }
    
                                registroC100.SER = linha[7];
                                registroC100.NUM_DOC = linha[8];
                                registroC100.CHV_NFE = linha[9];
    
                                if (linha[10] != string.Empty)
                                {
                                    registroC100.DT_DOC = long.Parse(Convert.ToString(linha[10])).ToString(@"00/00/0000");
                                }
                                
                                if (linha[11] != string.Empty)
                                {
                                    registroC100.DT_E_S = long.Parse(Convert.ToString(linha[11])).ToString(@"00/00/0000");
                                }
                                
                                registroC100.VL_DOC = linha[12];
                                registroC100.IND_PGTO = linha[13];
                                registroC100.VL_DESC = linha[14];
                                registroC100.VL_ABAT_NT = linha[15];
                                registroC100.VL_MERC = linha[16];
                                registroC100.IND_FRT = linha[17];
                                registroC100.VL_FRT = linha[18];
                                registroC100.VL_SEG = linha[19];
                                registroC100.VL_OUT_DA = linha[20];
                                registroC100.VL_BC_ICMS = linha[21];
                                registroC100.VL_ICMS = linha[22];
                                registroC100.VL_BC_ICMS_ST = linha[22];
                                registroC100.VL_ICMS_ST = linha[23];
                                registroC100.VL_IPI = linha[24];
                                registroC100.VL_PIS = linha[25];
                                registroC100.VL_COFINS = linha[26];
                                registroC100.VL_PIS_ST = linha[27];
                                registroC100.VL_COFINS_ST = linha[28];                            
                            }
                            listaRegistroC100.Add(registroC100);                        
                        }
                        if (linha[1].ToString().Contains("C190"))
                        {
                            foreach (var linhaRegistroC190 in linha[1] = "C190")
                            {
                                registroC190.REG = linha[1];
                                registroC190.CST_ICMS = linha[2];
                                registroC190.CFOP = linha[3];
                                registroC190.ALIQ_ICMS = linha[4];
                                registroC190.VL_OPR = linha[5];
                                registroC190.VL_BC_ICMS = linha[6];
                                registroC190.VL_ICMS = linha[7];
                                registroC190.VL_BC_ICMS_ST = linha[8];
                                registroC190.VL_ICMS_ST = linha[9];
                                registroC190.VL_RED_BC = linha[10];
                                registroC190.VL_IPI = linha[11];
                                registroC190.COD_OBS = linha[12];
                            }
                            listaRegistroC190.Add(registroC190);
                        }
                        #endregion
                    }
    
                    #region Registro 0000
                    lbPeriodoApuracao.Text = long.Parse(listaRegistro0000[0].DT_INI).ToString(@"00/00/0000") + " à " + long.Parse(listaRegistro0000[0].DT_FIN).ToString(@"00/00/0000");
                    lbVersaoLayout.Text = listaRegistro0000[0].COD_VER;
    
                    switch (listaRegistro0000[0].COD_FIN)
                    {
                        case 0:
                            lbCodigoFinalidade.Text = "0 - Remessa do arquivo original";
                            break;
    
                        case 1:
                            lbCodigoFinalidade.Text = "1 - Remessa do arquivo substituto";
                            break;
                    }
    
                    switch (listaRegistro0000[0].IND_ATIV)
                    {
                        case 0:
                            lbTipoAtividade.Text = "0 - Industrial ou equiparado a industrial";
                            break;
    
                        case 1:
                            lbTipoAtividade.Text = "1 - Outros";
                            break;
                    }
    
                    lbPerfilArquivoFiscal.Text = listaRegistro0000[0].IND_PERFIL;
                    lbRazaoSocialSped.Text = listaRegistro0000[0].NOME;
                    lbCnpjSped.Text = long.Parse(listaRegistro0000[0].CNPJ).ToString(@"00\.000\.000/0000-00");
                    lbInscricaoEstadualSped.Text = listaRegistro0000[0].IE;
                    lbInscricaoMunicipalSped.Text = listaRegistro0000[0].IM;
                    lbInscricaoSuframaSped.Text = listaRegistro0000[0].SUFRAMA;
                    lbMunicipioUf.Text = listaRegistro0000[0].COD_MUN + " - " + listaRegistro0000[0].UF;
                    #endregion
    
                    #region Registro 0005
                    lbNomeFantasiaSped.Text = listaRegistro0005[0].FANTASIA;
                    lbEnderecoCompleto.Text = listaRegistro0005[0].END + ", ";
                    lbEnderecoCompleto.Text += listaRegistro0005[0].NUM + " ";
                    lbEnderecoCompleto.Text += listaRegistro0005[0].COMPL + " - ";
                    lbEnderecoCompleto.Text += listaRegistro0005[0].BAIRRO;
                    lbCep.Text = listaRegistro0005[0].CEP;
                    lbTelefone.Text = listaRegistro0005[0].FONE + " " + listaRegistro0005[0].FAX;
                    lbEmail.Text = listaRegistro0005[0].EMAIL;
                    #endregion
    
                    #region Registro 0100
                    /*if (listaRegistro0100.Count > 0)
                    {
                        lbNomeContabilista.Text = listaRegistro0100[0].NOME;
                        lbCpfContabilista.Text = long.Parse(listaRegistro0100[0].CPF).ToString(@"000\.000\.000-00");
    
                        if (listaRegistro0100[0].CNPJ != string.Empty)
                        {
                            lbCnpjContabilista.Text = long.Parse(listaRegistro0100[0].CNPJ).ToString(@"00\.000\.000/0000-00");
                        }
    
                        lbCrcContabilista.Text = listaRegistro0100[0].CRC;
                        lbEnderecoCompletoContabilista.Text = listaRegistro0100[0].END + ", " + listaRegistro0100[0].NUM + " - " + listaRegistro0100[0].BAIRRO + " " + listaRegistro0100[0].COMPL;
                        lbCepContabilista.Text = long.Parse(listaRegistro0100[0].CEP).ToString(@"00000-000");
                        lbMunicipioUfContabilista.Text = listaRegistro0100[0].COD_MUN;
                        lbTelefoneContabilista.Text = listaRegistro0100[0].FONE + " " + listaRegistro0100[0].FAX;
                        lbEmailContabilista.Text = listaRegistro0100[0].EMAIL;
                    }*/
                    #endregion
    
                    #region Registro C100
                    switch (cbFiltroTipoOperacao.SelectedIndex)
                    {
                        // 0 - ENTRADA
                        // 1 - SAÍDA
    
                        case 0:
                            for (int i = 0; i < listaRegistroC100.Count; i++)
                            {
                                if (listaRegistroC100[i].IND_OPER == 0)
                                {
                                    listaRegistroC100_EntradaSaida.Add(new BlocoC.RegistroC100
                                    {
                                        REG = listaRegistroC100[i].REG,
                                        IND_OPER = listaRegistroC100[i].IND_OPER,
                                        IND_EMIT = listaRegistroC100[i].IND_EMIT,
                                        COD_PART = listaRegistroC100[i].COD_PART,
                                        COD_MOD = listaRegistroC100[i].COD_MOD,
                                        COD_SIT = listaRegistroC100[i].COD_SIT,
                                        SER = listaRegistroC100[i].SER,
                                        NUM_DOC = listaRegistroC100[i].NUM_DOC,
                                        CHV_NFE = listaRegistroC100[i].CHV_NFE,
                                        DT_DOC = listaRegistroC100[i].DT_DOC,
                                        DT_E_S = listaRegistroC100[i].DT_E_S,
                                        VL_DOC = listaRegistroC100[i].VL_DOC,
                                        IND_PGTO = listaRegistroC100[i].IND_PGTO,
                                        VL_DESC = listaRegistroC100[i].VL_DESC,
                                        VL_ABAT_NT = listaRegistroC100[i].VL_ABAT_NT,
                                        VL_MERC = listaRegistroC100[i].VL_MERC,
                                        IND_FRT = listaRegistroC100[i].IND_FRT,
                                        VL_FRT = listaRegistroC100[i].VL_FRT,
                                        VL_SEG = listaRegistroC100[i].VL_SEG,
                                        VL_OUT_DA = listaRegistroC100[i].VL_OUT_DA,
                                        VL_BC_ICMS = listaRegistroC100[i].VL_BC_ICMS,
                                        VL_ICMS = listaRegistroC100[i].VL_ICMS,
                                        VL_BC_ICMS_ST = listaRegistroC100[i].VL_BC_ICMS_ST,
                                        VL_ICMS_ST = listaRegistroC100[i].VL_ICMS_ST,
                                        VL_IPI = listaRegistroC100[i].VL_IPI,
                                        VL_PIS = listaRegistroC100[i].VL_PIS,
                                        VL_COFINS = listaRegistroC100[i].VL_COFINS,
                                        VL_PIS_ST = listaRegistroC100[i].VL_PIS_ST,
                                        VL_COFINS_ST = listaRegistroC100[i].VL_COFINS_ST
                                    });
                                }
                            }
    
                            dataGridViewC100.DataSource = null;
                            dataGridViewC100.DataSource = listaRegistroC100_EntradaSaida;
                            dataGridViewC100.Update();
                            dataGridViewC100.Refresh();
                            break;
    
                        case 1:
                            switch (cbFiltroModeloDocumento.SelectedIndex)
                            {
                                // 0 - 55
                                // 1 - 65
                                case 0:
                                    for (int i = 0; i < listaRegistroC100.Count; i++)
                                    {
                                        if (listaRegistroC100[i].IND_OPER == 1 && listaRegistroC100[i].COD_MOD == "55")
                                        {
                                            listaRegistroC100_EntradaSaida.Add(new BlocoC.RegistroC100
                                            {
                                                REG = listaRegistroC100[i].REG,
                                                IND_OPER = listaRegistroC100[i].IND_OPER,
                                                IND_EMIT = listaRegistroC100[i].IND_EMIT,
                                                COD_PART = listaRegistroC100[i].COD_PART,
                                                COD_MOD = listaRegistroC100[i].COD_MOD,
                                                COD_SIT = listaRegistroC100[i].COD_SIT,
                                                SER = listaRegistroC100[i].SER,
                                                NUM_DOC = listaRegistroC100[i].NUM_DOC,
                                                CHV_NFE = listaRegistroC100[i].CHV_NFE,
                                                DT_DOC = listaRegistroC100[i].DT_DOC,
                                                DT_E_S = listaRegistroC100[i].DT_E_S,
                                                VL_DOC = listaRegistroC100[i].VL_DOC,
                                                IND_PGTO = listaRegistroC100[i].IND_PGTO,
                                                VL_DESC = listaRegistroC100[i].VL_DESC,
                                                VL_ABAT_NT = listaRegistroC100[i].VL_ABAT_NT,
                                                VL_MERC = listaRegistroC100[i].VL_MERC,
                                                IND_FRT = listaRegistroC100[i].IND_FRT,
                                                VL_FRT = listaRegistroC100[i].VL_FRT,
                                                VL_SEG = listaRegistroC100[i].VL_SEG,
                                                VL_OUT_DA = listaRegistroC100[i].VL_OUT_DA,
                                                VL_BC_ICMS = listaRegistroC100[i].VL_BC_ICMS,
                                                VL_ICMS = listaRegistroC100[i].VL_ICMS,
                                                VL_BC_ICMS_ST = listaRegistroC100[i].VL_BC_ICMS_ST,
                                                VL_ICMS_ST = listaRegistroC100[i].VL_ICMS_ST,
                                                VL_IPI = listaRegistroC100[i].VL_IPI,
                                                VL_PIS = listaRegistroC100[i].VL_PIS,
                                                VL_COFINS = listaRegistroC100[i].VL_COFINS,
                                                VL_PIS_ST = listaRegistroC100[i].VL_PIS_ST,
                                                VL_COFINS_ST = listaRegistroC100[i].VL_COFINS_ST
                                            });
    
                                            switch (listaRegistroC100[i].COD_SIT.Substring(0, 2))
                                            {
                                                // 00 - Documento Regular
                                                // 01 - Documento Regular Extemporâneo
                                                // 02 - Documento Cancelado
                                                // 03 - Documento Cancelado Extemporâneo
                                                // 04 - NFe, NFC-e ou CT-e denegado
                                                // 05 - NFe, NFC-e ou CT-e Numeração inutilizada
                                                // 06 - Documento Fiscal Complementar
                                                // 07 - Documento Fiscal Complementar Extemporâneo
                                                // 08 - Documento Fiscal Emitido com Base em Regime Especial ou Norma Específica
    
                                                case "00":
                                                    valorTotalAutorizadoSped += Convert.ToDecimal(listaRegistroC100[i].VL_DOC);
                                                    quantidadeTotalAutorizadoSped++;
                                                    break;
    
                                                case "01":
                                                    valorTotalAutorizadoSped += Convert.ToDecimal(listaRegistroC100[i].VL_DOC);
                                                    quantidadeTotalAutorizadoSped++;
                                                    break;
    
                                                case "02":
                                                    quantidadeTotalCanceladoSped++;
                                                    break;
    
                                                case "03":
                                                    quantidadeTotalCanceladoSped++;
                                                    break;
    
                                                case "04":
                                                    quantidadeTotalDenegadoSped++;
                                                    break;
                                            }
                                        }
                                    }
                                    break;
    
                                case 1:
                                    for (int i = 0; i < listaRegistroC100.Count; i++)
                                    {
                                        if (listaRegistroC100[i].IND_OPER == 1 && listaRegistroC100[i].COD_MOD == "65")
                                        {
                                            listaRegistroC100_EntradaSaida.Add(new BlocoC.RegistroC100
                                            {
                                                REG = listaRegistroC100[i].REG,
                                                IND_OPER = listaRegistroC100[i].IND_OPER,
                                                IND_EMIT = listaRegistroC100[i].IND_EMIT,
                                                COD_PART = listaRegistroC100[i].COD_PART,
                                                COD_MOD = listaRegistroC100[i].COD_MOD,
                                                COD_SIT = listaRegistroC100[i].COD_SIT,
                                                SER = listaRegistroC100[i].SER,
                                                NUM_DOC = listaRegistroC100[i].NUM_DOC,
                                                CHV_NFE = listaRegistroC100[i].CHV_NFE,
                                                DT_DOC = listaRegistroC100[i].DT_DOC,
                                                DT_E_S = listaRegistroC100[i].DT_E_S,
                                                VL_DOC = listaRegistroC100[i].VL_DOC,
                                                IND_PGTO = listaRegistroC100[i].IND_PGTO,
                                                VL_DESC = listaRegistroC100[i].VL_DESC,
                                                VL_ABAT_NT = listaRegistroC100[i].VL_ABAT_NT,
                                                VL_MERC = listaRegistroC100[i].VL_MERC,
                                                IND_FRT = listaRegistroC100[i].IND_FRT,
                                                VL_FRT = listaRegistroC100[i].VL_FRT,
                                                VL_SEG = listaRegistroC100[i].VL_SEG,
                                                VL_OUT_DA = listaRegistroC100[i].VL_OUT_DA,
                                                VL_BC_ICMS = listaRegistroC100[i].VL_BC_ICMS,
                                                VL_ICMS = listaRegistroC100[i].VL_ICMS,
                                                VL_BC_ICMS_ST = listaRegistroC100[i].VL_BC_ICMS_ST,
                                                VL_ICMS_ST = listaRegistroC100[i].VL_ICMS_ST,
                                                VL_IPI = listaRegistroC100[i].VL_IPI,
                                                VL_PIS = listaRegistroC100[i].VL_PIS,
                                                VL_COFINS = listaRegistroC100[i].VL_COFINS,
                                                VL_PIS_ST = listaRegistroC100[i].VL_PIS_ST,
                                                VL_COFINS_ST = listaRegistroC100[i].VL_COFINS_ST
                                            });
    
                                            switch (listaRegistroC100[i].COD_SIT.Substring(0, 2))
                                            {
                                                // 00 - Documento Regular
                                                // 01 - Documento Regular Extemporâneo
                                                // 02 - Documento Cancelado
                                                // 03 - Documento Cancelado Extemporâneo
                                                // 04 - NFe, NFC-e ou CT-e denegado
                                                // 05 - NFe, NFC-e ou CT-e Numeração inutilizada
                                                // 06 - Documento Fiscal Complementar
                                                // 07 - Documento Fiscal Complementar Extemporâneo
                                                // 08 - Documento Fiscal Emitido com Base em Regime Especial ou Norma Específica
    
                                                case "00":
                                                    valorTotalAutorizadoSped += Convert.ToDecimal(listaRegistroC100[i].VL_DOC);
                                                    quantidadeTotalAutorizadoSped++;
                                                    break;
    
                                                case "01":
                                                    valorTotalAutorizadoSped += Convert.ToDecimal(listaRegistroC100[i].VL_DOC);
                                                    quantidadeTotalAutorizadoSped++;
                                                    break;
    
                                                case "02":
                                                    quantidadeTotalCanceladoSped++;
                                                    break;
    
                                                case "03":
                                                    quantidadeTotalCanceladoSped++;
                                                    break;
    
                                                case "04":
                                                    quantidadeTotalDenegadoSped++;
                                                    break;
                                            }
                                        }
                                    }
                                    break;
                            }
    
                            dataGridViewC100.DataSource = null;
                            dataGridViewC100.DataSource = listaRegistroC100_EntradaSaida;
                            dataGridViewC100.Update();
                            dataGridViewC100.Refresh();
                            break;
                    }
    
                    tsslQuantidadeTotalAutorizadoSpedFiscal.Text = quantidadeTotalAutorizadoSped.ToString();
                    tsslValorTotalAutorizadoSpedFiscal.Text = Convert.ToString(string.Format("{0:N2}", valorTotalAutorizadoSped));
                    tsslQuantidadeTotalCanceladoSpedFiscal.Text = quantidadeTotalCanceladoSped.ToString();
                    tsslQuantidadeTotalDenegadoSpedFiscal.Text = quantidadeTotalDenegadoSped.ToString();
                    #endregion
    
                    #region Registro C190
                    /*dataGridViewC190.DataSource = null;
                    dataGridViewC190.DataSource = listaRegistroC190;
                    dataGridViewC100.Update();
                    dataGridViewC190.Refresh();*/
                    #endregion
                }
                catch (Exception ex)
                {
                    MessageBox.Show("Advertência: " + ex.ToString(), "Advertência", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
                }
            }


    • Editado JehanKheller terça-feira, 10 de dezembro de 2019 11:26
    terça-feira, 10 de dezembro de 2019 11:25
  • Bom dia Jehan,

    Olhando seu código, vi algumas coisas que podem ser úteis:

    Não entendi o uso dos laços desse tipo foreach (var linhaRegistroXXXX in linha[1] = "XXXX") acho que ele não é necessário. Primeiro porque você já percorre todas as linhas no primeiro foreach (var item in arquivoSped). Outro ponto é que o objeto linhaRegistroXXXX não é utilizado e outra coisa é que ao fazer isso, você atribui o valor "XXXX" na variável linha[1] e percorre cada caractere. Acredito que não é isso que queremos. Na minha opinião, esse foreach pode ser removido. A não ser que tenha alguma coisa que não percebi.

    Você disse que já pega o número da nota na linha "registroC100.NUM_DOC = linha[8];". Então agora basta vincular os registros do tipo C190 e C170. Crie uma propriedade NUM_DOC na classe BlocoC.RegistroC190 e na hora de carregar as informações no objeto registroC190 preencha essa propridade com o valor armazenado:

    [...]
    
    registroC190.COD_OBS = linha[12];
    registroC190.NUM_DOC = registroC100.NUM_DOC;
    
    [...]

    Espero ter ajudado

    terça-feira, 10 de dezembro de 2019 13:09
  • Bom dia Jehan,

    Olhando seu código, vi algumas coisas que podem ser úteis:

    Não entendi o uso dos laços desse tipo foreach (var linhaRegistroXXXX in linha[1] = "XXXX") acho que ele não é necessário. Primeiro porque você já percorre todas as linhas no primeiro foreach (var item in arquivoSped). Outro ponto é que o objeto linhaRegistroXXXX não é utilizado e outra coisa é que ao fazer isso, você atribui o valor "XXXX" na variável linha[1] e percorre cada caractere. Acredito que não é isso que queremos. Na minha opinião, esse foreach pode ser removido. A não ser que tenha alguma coisa que não percebi.

    Você disse que já pega o número da nota na linha "registroC100.NUM_DOC = linha[8];". Então agora basta vincular os registros do tipo C190 e C170. Crie uma propriedade NUM_DOC na classe BlocoC.RegistroC190 e na hora de carregar as informações no objeto registroC190 preencha essa propridade com o valor armazenado:

    [...]
    
    registroC190.COD_OBS = linha[12];
    registroC190.NUM_DOC = registroC100.NUM_DOC;
    
    [...]

    Espero ter ajudado

    O primeiro foreach serve para percorrer todo o arquivo, já o segundo foreach serve para percorrer as linhas da condição if, então:

    if (linha[1].ToString().Contains("0000"))
    {
       foreach (var linhaRegistro0000 in linha[1] = "0000")
       {
          registro0000.REG = linha[1];
          registro0000.COD_VER = linha[2];
          registro0000.COD_FIN = Convert.ToInt32(linha[3]);
          registro0000.DT_INI = linha[4];
          registro0000.DT_FIN = linha[5];
          registro0000.NOME = linha[6];
          registro0000.CNPJ = linha[7];
          registro0000.CPF = linha[8];
          registro0000.UF = linha[9];
          registro0000.IE = linha[10];
          registro0000.COD_MUN = int.Parse(linha[11]);
          registro0000.IM = linha[12];
          registro0000.SUFRAMA = linha[13];
          registro0000.IND_PERFIL = linha[14];
          registro0000.IND_ATIV = int.Parse(linha[15]);
    
          listaRegistro0000.Add(registro0000);
       }                        
    }

    Sobre informar o número da nota em cada registro C170 e C190, na sua opinião, em qual parte do código faria isso? Por que já tentei algumas soluções e nada funcionou.


    • Editado JehanKheller terça-feira, 10 de dezembro de 2019 14:27
    terça-feira, 10 de dezembro de 2019 14:24
  • O primeiro foreach já percorre todas as linhas do arquivo. E os if vão direcionando para qual objeto ou lista essas linhas serão carregadas. Por isso, só é necessário o primeiro foreach.

    E mesmo se precisasse do segundo, ele estaria errado, pois ele está atribuindo o valor "0000" para linha[1] e percorrendo cada caractere '0'. Veja que ao sair desse for, cada registro fica repetido 4 vezes em listaRegistro0000. Porque ele está acrescentando um registro0000 a cada '0' da string "0000".

    Sobre informar o número da nota em cada registro, você deve fazer isso na hora de preencher os objetos registroC190 e registroC170 (Coloquei um exemplo na resposta anterior).
    terça-feira, 10 de dezembro de 2019 14:53
  • O primeiro foreach já percorre todas as linhas do arquivo. E os if vão direcionando para qual objeto ou lista essas linhas serão carregadas. Por isso, só é necessário o primeiro foreach.

    E mesmo se precisasse do segundo, ele estaria errado, pois ele está atribuindo o valor "0000" para linha[1] e percorrendo cada caractere '0'. Veja que ao sair desse for, cada registro fica repetido 4 vezes em listaRegistro0000. Porque ele está acrescentando um registro0000 a cada '0' da string "0000".

    Sobre informar o número da nota em cada registro, você deve fazer isso na hora de preencher os objetos registroC190 e registroC170 (Coloquei um exemplo na resposta anterior).

    Boa tarde João.

    Acabei de remover os foreach e realmente funciona conforme você orientou. Não lembro da necessidade de ter colocado os demais foreach.

    Também implementei o código que você me orientou porém não está adicionando os valores. Segue print e código abaixo:

                        if (linha[1].ToString().Equals("C100"))
                        {
                            registroC100.REG = linha[1];
                            registroC100.IND_OPER = Convert.ToInt32(linha[2]);
                            registroC100.IND_EMIT = Convert.ToInt32(linha[3]);
                            registroC100.COD_PART = linha[4];
                            registroC100.COD_MOD = linha[5];
    
                            switch (linha[6])
                            {
                                // 00 - Documento Regular
                                // 01 - Documento Regular Extemporâneo
                                // 02 - Documento Cancelado
                                // 03 - Documento Cancelado Extemporâneo
                                // 04 - NFe, NFC-e ou CT-e denegado
                                // 05 - NFe, NFC-e ou CT-e Numeração inutilizada
                                // 06 - Documento Fiscal Complementar
                                // 07 - Documento Fiscal Complementar Extemporâneo
                                // 08 - Documento Fiscal Emitido com Base em Regime Especial ou Norma Específica
    
                                case "00":
                                    registroC100.COD_SIT = "00 - Documento Regular";
                                    break;
    
                                case "01":
                                    registroC100.COD_SIT = "01 - Documento Regular Extemporâneo";
                                    break;
    
                                case "02":
                                    registroC100.COD_SIT = "02 - Documento Cancelado";
                                    break;
    
                                case "03":
                                    registroC100.COD_SIT = "03 - Documento Cancelado Extemporâneo";
                                    break;
    
                                case "04":
                                    registroC100.COD_SIT = "04 - NFe, NFC-e ou CT-e denegado";
                                    break;
    
                                case "05":
                                    registroC100.COD_SIT = "05 - NFe, NFC-e ou CT-e Numeração inutilizada";
                                    break;
    
                                case "06":
                                    registroC100.COD_SIT = "06 - Documento Fiscal Complementar";
                                    break;
    
                                case "07":
                                    registroC100.COD_SIT = "07 - Documento Fiscal Complementar Extemporâneo";
                                    break;
    
                                case "08":
                                    registroC100.COD_SIT = "08 - Documento Fiscal Emitido com Base em Regime Especial ou Norma Específica";
                                    break;
                            }
    
                            registroC100.SER = linha[7];
                            registroC100.NUM_DOC = linha[8];
                            registroC100.CHV_NFE = linha[9];
    
                            if (linha[10] != string.Empty)
                            {
                                registroC100.DT_DOC = long.Parse(Convert.ToString(linha[10])).ToString(@"00/00/0000");
                            }
    
                            if (linha[11] != string.Empty)
                            {
                                registroC100.DT_E_S = long.Parse(Convert.ToString(linha[11])).ToString(@"00/00/0000");
                            }
    
                            registroC100.VL_DOC = linha[12];
                            registroC100.IND_PGTO = linha[13];
                            registroC100.VL_DESC = linha[14];
                            registroC100.VL_ABAT_NT = linha[15];
                            registroC100.VL_MERC = linha[16];
                            registroC100.IND_FRT = linha[17];
                            registroC100.VL_FRT = linha[18];
                            registroC100.VL_SEG = linha[19];
                            registroC100.VL_OUT_DA = linha[20];
                            registroC100.VL_BC_ICMS = linha[21];
                            registroC100.VL_ICMS = linha[22];
                            registroC100.VL_BC_ICMS_ST = linha[22];
                            registroC100.VL_ICMS_ST = linha[23];
                            registroC100.VL_IPI = linha[24];
                            registroC100.VL_PIS = linha[25];
                            registroC100.VL_COFINS = linha[26];
                            registroC100.VL_PIS_ST = linha[27];
                            registroC100.VL_COFINS_ST = linha[28];
    
                            listaRegistroC100.Add(registroC100);
                        }
                        if (linha[1].ToString().Equals("C190"))
                        {
                            registroC190.RegistroC100.NUM_DOC = registroC100.NUM_DOC;
                            registroC190.RegistroC100.IND_OPER = registroC100.IND_OPER;
                            registroC190.REG = linha[1];
                            registroC190.CST_ICMS = linha[2];
                            registroC190.CFOP = linha[3];
                            registroC190.ALIQ_ICMS = linha[4];
                            registroC190.VL_OPR = linha[5];
                            registroC190.VL_BC_ICMS = linha[6];
                            registroC190.VL_ICMS = linha[7];
                            registroC190.VL_BC_ICMS_ST = linha[8];
                            registroC190.VL_ICMS_ST = linha[9];
                            registroC190.VL_RED_BC = linha[10];
                            registroC190.VL_IPI = linha[11];
                            registroC190.COD_OBS = linha[12];
    
                            listaRegistroC190.Add(registroC190);
                        }
    

    Lembro bem que eu já havia tentado essa solução mas o resultado foi exatamente o mesmo.

    
    terça-feira, 10 de dezembro de 2019 19:37
  • É verdade, tem um problema aí que eu não tinha percebido.
    Não está carregando porque o código abaixo está dentro do foreach. Aí ele sempre vai limpar o NUM_DOC:

    #region Instâncias Bloco C
    BlocoC.RegistroC100 registroC100 = new BlocoC.RegistroC100();

    Para resolver isso você pode jogar essa linha antes do foreach (mas aí tem que verificar se não vai ficar dados desnecessários a cada iteração), ou criar uma variável fora do foreach para armazenar o NUM_DOC, e preenche-la junto com o registroC100.

    [...]
    
    //Cria a variável que vai guardar o numero do documento.Ela vai manter o numero até encontrar outro registro C100
    string numDoc = ""; 
    foreach (var item in arquivoSped)
    
    [...]
    
    registroC100.NUM_DOC = linha[8]; // Aqui você já preenche o numero do documento no objeto registroC100.NUM_DOC 
    numDoc = registroC100.NUM_DOC    // Só vai armazenar na variável também
    
    [...]
    
    // Aqui você ao invés de pegar o número direto do objeto dessa forma
    registroC190.RegistroC100.NUM_DOC = registroC100.NUM_DOC; 
    
    //Pegue da variável. Substitua essa linha por:
    registroC190.RegistroC100.NUM_DOC = numDoc ; 

    Acredito que dessa forma irá funcionar.

    • Marcado como Resposta JehanKheller quinta-feira, 12 de dezembro de 2019 01:41
    terça-feira, 10 de dezembro de 2019 20:02
  • É verdade, tem um problema aí que eu não tinha percebido.
    Não está carregando porque o código abaixo está dentro do foreach. Aí ele sempre vai limpar o NUM_DOC:

    #region Instâncias Bloco C
    BlocoC.RegistroC100 registroC100 = new BlocoC.RegistroC100();

    Para resolver isso você pode jogar essa linha antes do foreach (mas aí tem que verificar se não vai ficar dados desnecessários a cada iteração), ou criar uma variável fora do foreach para armazenar o NUM_DOC, e preenche-la junto com o registroC100.

    [...]
    
    //Cria a variável que vai guardar o numero do documento.Ela vai manter o numero até encontrar outro registro C100
    string numDoc = ""; 
    foreach (var item in arquivoSped)
    
    [...]
    
    registroC100.NUM_DOC = linha[8]; // Aqui você já preenche o numero do documento no objeto registroC100.NUM_DOC 
    numDoc = registroC100.NUM_DOC    // Só vai armazenar na variável também
    
    [...]
    
    // Aqui você ao invés de pegar o número direto do objeto dessa forma
    registroC190.RegistroC100.NUM_DOC = registroC100.NUM_DOC; 
    
    //Pegue da variável. Substitua essa linha por:
    registroC190.RegistroC100.NUM_DOC = numDoc ; 

    Acredito que dessa forma irá funcionar.

    E se eu te falar que eu já havia tentado isso antes de te enviar a mensagem? Hehe, rapaz, realmente não sei como resolver esse problema.
    terça-feira, 10 de dezembro de 2019 21:41
  • É verdade, tem um problema aí que eu não tinha percebido.
    Não está carregando porque o código abaixo está dentro do foreach. Aí ele sempre vai limpar o NUM_DOC:

    #region Instâncias Bloco C
    BlocoC.RegistroC100 registroC100 = new BlocoC.RegistroC100();

    Para resolver isso você pode jogar essa linha antes do foreach (mas aí tem que verificar se não vai ficar dados desnecessários a cada iteração), ou criar uma variável fora do foreach para armazenar o NUM_DOC, e preenche-la junto com o registroC100.

    [...]
    
    //Cria a variável que vai guardar o numero do documento.Ela vai manter o numero até encontrar outro registro C100
    string numDoc = ""; 
    foreach (var item in arquivoSped)
    
    [...]
    
    registroC100.NUM_DOC = linha[8]; // Aqui você já preenche o numero do documento no objeto registroC100.NUM_DOC 
    numDoc = registroC100.NUM_DOC    // Só vai armazenar na variável também
    
    [...]
    
    // Aqui você ao invés de pegar o número direto do objeto dessa forma
    registroC190.RegistroC100.NUM_DOC = registroC100.NUM_DOC; 
    
    //Pegue da variável. Substitua essa linha por:
    registroC190.RegistroC100.NUM_DOC = numDoc ; 

    Acredito que dessa forma irá funcionar.

    Boa noite João.

    Finalmente consegui resolver esta questão fazendo justamente o que orientou. Criei duas variáveis por fora do laço, desta forma o número das notas é incluído juntamente com os registros C190.

    Muito obrigado pela ajuda dada a minha solictação.

    quinta-feira, 12 de dezembro de 2019 01:41