none
Grupo Veiculo e Reboque NF-e RRS feed

  • Pergunta

  • Bom dia, estou gerando o XML da NF-e, porém surgiu uma dúvida, quando coloco pra incluir um veículo, ou um reboque, não dá certo, ou ele não é enviado para o XML, ou ele informa o erro. Provavelmente estou declarando errado, porém já tentei várias formas, e nenhuma funciona corretamente.

    Por exemplo, fiz a balsa assim: e deu certo, e a mesma lógica para veículo ou reboque não dá.

     if (rbbalsa.Checked == true)
                        {
    
                            transp.Items = new string[0];
                            transp.ItemsElementName = new ItemsChoiceType5[0];
                            transp.Items[0] = txtbalsa.Text;
                            transp.ItemsElementName[0] = ItemsChoiceType5.balsa;
    
                        }

    Segue o código que estou usando para veículo:

     if (rbveiculo.Checked == true)
                        {
                            TVeiculo veiculo = new TVeiculo();
                            veiculo.placa = mplaca.Text;
                            veiculo.UF = (TUf)Enum.Parse(typeof(TUf), cbufveiculo.Text);
                            if (txtrntc.Text != "")
                            {
                                veiculo.RNTC = txtrntc.Text;
                            }
                            //transp.Items = new string[2];
                            //transp.ItemsElementName = new ItemsChoiceType5[2];
                            //transp.Items[2] = veiculo;
                            //transp.ItemsElementName[2] = ItemsChoiceType5.veicTransp;
                            
                           
                        }

    E esse para reboque: (a parte de reboque é salva no grid, pois pode ser vários) 

    if (dgvreboque.Rows.Count > 0)
                        {
                            transp.Items = new string[dgvprodutos.Rows.Count];
                            transp.ItemsElementName = new ItemsChoiceType5[dgvprodutos.Rows.Count];
                            int ind = 0;
                            foreach (DataGridViewRow row in dgvreboque.Rows)
                            {
                                TVeiculo veiculo = new TVeiculo();
                                veiculo.placa = mplaca.Text;
                                veiculo.UF = (TUf)Enum.Parse(typeof(TUf), cbufveiculo.Text);
                                veiculo.RNTC = txtrntc.Text;
                                transp.Items[ind] = veiculo;
                                transp.ItemsElementName[ind] = ItemsChoiceType5.reboque;
                                ind++;
                            }
                        }

    Agradeço quem puder ajudar. 

    sexta-feira, 11 de novembro de 2016 13:35

Respostas

  • A parte que atribui o objeto veiculo a uma posição do array na propriedade Items também estava comentada 

    //transp.Items[ind] = veiculo;

    Você removeu o comentário nesta parte também?


    If you found this post helpful, please "Vote as Helpful". If it actually answered your question, remember to "Mark as Answer".

    Se achou este post útil, por favor clique em "Votar como útil". Se por acaso respondeu sua dúvida, lembre de "Marcar como Resposta".


    sexta-feira, 11 de novembro de 2016 14:40
  • Um detalhe que percebi é que você faz o loop nas Rows do DataGridView, mas pega sempre a Row atual (dgvreboque.CurrentRow), então substitui no código abaixo.

    Tente assim:

                        if (dgvreboque.Rows.Count > 0)
                        {
                            transp.Items = new TVeiculo[dgvreboque.Rows.Count];
                            transp.ItemsElementName = new ItemsChoiceType5[dgvreboque.Rows.Count];
                            int ind = 0;
                            foreach (DataGridViewRow row in dgvreboque.Rows)
                            {
                                TVeiculo veiculo = new TVeiculo();
                                veiculo.placa =  row.Cells[1].Value.ToString();
                                veiculo.UF = (TUf)Enum.Parse(typeof(TUf), row.Cells[2].Value.ToString());
                                veiculo.RNTC = row.Cells[3].Value.ToString();
                                transp.Items[ind] = veiculo;
                                transp.ItemsElementName[ind] = ItemsChoiceType5.reboque;
                                ind++;
                            }
                        }

    O erro de intervalo inválido foi em qual das linhas? Esqueci de perguntar isto antes.


    If you found this post helpful, please "Vote as Helpful". If it actually answered your question, remember to "Mark as Answer".

    Se achou este post útil, por favor clique em "Votar como útil". Se por acaso respondeu sua dúvida, lembre de "Marcar como Resposta".

    • Marcado como Resposta Mariana C. Costa sexta-feira, 11 de novembro de 2016 17:17
    sexta-feira, 11 de novembro de 2016 16:41
  • Neste caso seria assim:

    transp.Items = new TVeiculo[1];
                                transp.ItemsElementName = new ItemsChoiceType5[1];
         
                                veiculo.placa = mplaca.Text;
                                veiculo.UF = (TUf)Enum.Parse(typeof(TUf), cbufveiculo.Text);
                                if (txtrntc.Text != "")
                                {
                                    veiculo.RNTC = txtrntc.Text;
                                }
                                transp.Items[0] = veiculo;
                                transp.ItemsElementName[0] = ItemsChoiceType5.veicTransp;
    O valor entre colchetes (quando instanciando) indica o número de elementos no array, este foi o detalhe no seu código.


    If you found this post helpful, please "Vote as Helpful". If it actually answered your question, remember to "Mark as Answer".

    Se achou este post útil, por favor clique em "Votar como útil". Se por acaso respondeu sua dúvida, lembre de "Marcar como Resposta".


    sexta-feira, 11 de novembro de 2016 17:40

Todas as Respostas

  • Olá,

    Qual o erro?


    Se a resposta for relevante ou tenha resolvido seu problema, marque como útil/resposta!

    André Secco
    Microsoft MSP & MSDN Tech Advisor
    Blog: http://andresecco.com.br
    GitHub: http://github.com/andreluizsecco
    Twitter: @andre_secco

    sexta-feira, 11 de novembro de 2016 13:37
  • O erro em veículo e reboque é nessa linha:

    transp.Items[ind] = veiculo;
    O erro é:
    Additional information: Tentativa de acesso a um elemento como um tipo incompatível com a matriz.

    sexta-feira, 11 de novembro de 2016 13:45
  • transp.Items é um array de String, já sua variável veiculo é do tipo TVeiculo.

    If you found this post helpful, please "Vote as Helpful". If it actually answered your question, remember to "Mark as Answer".

    Se achou este post útil, por favor clique em "Votar como útil". Se por acaso respondeu sua dúvida, lembre de "Marcar como Resposta".


    sexta-feira, 11 de novembro de 2016 13:48
  • Para resolver isso sua variavel tem que ser um array de Veículos:

    E depois de mudar o tipo dela, deve instancia-la dessa forma:

    transp.Items = new TVeiculo[dgvprodutos.Rows.Count];


    Se a resposta for relevante ou tenha resolvido seu problema, marque como útil/resposta!

    André Secco
    Microsoft MSP & MSDN Tech Advisor
    Blog: http://andresecco.com.br
    GitHub: http://github.com/andreluizsecco
    Twitter: @andre_secco

    sexta-feira, 11 de novembro de 2016 13:55
  • Em reboque eu fiz dessa forma:

     if (dgvreboque.Rows.Count > 0)
                        {
                            transp.Items = new TVeiculo[dgvprodutos.Rows.Count];
                            //transp.ItemsElementName = new ItemsChoiceType5[dgvprodutos.Rows.Count];
                            int ind = 0;
                            foreach (DataGridViewRow row in dgvreboque.Rows)
                            {
                                TVeiculo veiculo = new TVeiculo();
                                veiculo.placa = mplaca.Text;
                                veiculo.UF = (TUf)Enum.Parse(typeof(TUf), cbufveiculo.Text);
                                veiculo.RNTC = txtrntc.Text;
                                //transp.Items[ind] = veiculo;
                                transp.ItemsElementName[ind] = ItemsChoiceType5.reboque;
                                ind++;
                            }
                        }

    Me aparece o erro nessa linha:  transp.ItemsElementName[ind] = ItemsChoiceType5.reboque;

    Additional information: Referência de objeto não definida para uma instância de um objeto.

    sexta-feira, 11 de novembro de 2016 14:03
  • Mariana,

    ItemChoiceType5 aparentemente é uma classe e que não foi instanciada, por isso o erro que você mencionou. 

    Ou seria ItemsChoiceType5 um enum?


    If you found this post helpful, please "Vote as Helpful". If it actually answered your question, remember to "Mark as Answer".

    Se achou este post útil, por favor clique em "Votar como útil". Se por acaso respondeu sua dúvida, lembre de "Marcar como Resposta".


    sexta-feira, 11 de novembro de 2016 14:07
  • É um Enum, pois informo nele se é balsa, veicTransp, reboque ou vagão.

    sexta-feira, 11 de novembro de 2016 14:13
  • E qual o tipo da propriedade ItemsElementName?

    É do tipo deste Enum ou é um array como você estava instanciando antes?

    Se puder compartilhar o código da classe do objeto transp.


    If you found this post helpful, please "Vote as Helpful". If it actually answered your question, remember to "Mark as Answer".

    Se achou este post útil, por favor clique em "Votar como útil". Se por acaso respondeu sua dúvida, lembre de "Marcar como Resposta".


    sexta-feira, 11 de novembro de 2016 14:17
  • Estou ainda meio perdida nessa parte Juliano, esse XML nessa parte, conseguiu me confundir rs

    Segue o código dessa parte:

    [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.1")]
    [System.SerializableAttribute()]
    [System.Diagnostics.DebuggerStepThroughAttribute()]
    [System.ComponentModel.DesignerCategoryAttribute("code")]
    [System.Xml.Serialization.XmlTypeAttribute(AnonymousType=true, Namespace="http://www.portalfiscal.inf.br/nfe")]
    public partial class TNFeInfNFeTransp {
        
        private TNFeInfNFeTranspModFrete modFreteField;
        
        private TNFeInfNFeTranspTransporta transportaField;
        
        private TNFeInfNFeTranspRetTransp retTranspField;
        
        private object[] itemsField;
        
        private ItemsChoiceType5[] itemsElementNameField;
        
        private TNFeInfNFeTranspVol[] volField;
        
        /// <remarks/>
        public TNFeInfNFeTranspModFrete modFrete {
            get {
                return this.modFreteField;
            }
            set {
                this.modFreteField = value;
            }
        }
        
        /// <remarks/>
        public TNFeInfNFeTranspTransporta transporta {
            get {
                return this.transportaField;
            }
            set {
                this.transportaField = value;
            }
        }
        
        /// <remarks/>
        public TNFeInfNFeTranspRetTransp retTransp {
            get {
                return this.retTranspField;
            }
            set {
                this.retTranspField = value;
            }
        }
        
        /// <remarks/>
        [System.Xml.Serialization.XmlElementAttribute("balsa", typeof(string))]
        [System.Xml.Serialization.XmlElementAttribute("reboque", typeof(TVeiculo))]
        [System.Xml.Serialization.XmlElementAttribute("vagao", typeof(string))]
        [System.Xml.Serialization.XmlElementAttribute("veicTransp", typeof(TVeiculo))]
        [System.Xml.Serialization.XmlChoiceIdentifierAttribute("ItemsElementName")]
        public object[] Items {
            get {
                return this.itemsField;
            }
            set {
                this.itemsField = value;
            }
        }
        
        /// <remarks/>
        [System.Xml.Serialization.XmlElementAttribute("ItemsElementName")]
        [System.Xml.Serialization.XmlIgnoreAttribute()]
        public ItemsChoiceType5[] ItemsElementName {
            get {
                return this.itemsElementNameField;
            }
            set {
                this.itemsElementNameField = value;
            }
        }
        
        /// <remarks/>
        [System.Xml.Serialization.XmlElementAttribute("vol")]
        public TNFeInfNFeTranspVol[] vol {
            get {
                return this.volField;
            }
            set {
                this.volField = value;
            }
        }
    }

    sexta-feira, 11 de novembro de 2016 14:21
  • Remova o comentário da linha abaixo e tente novamente.

    //transp.ItemsElementName = new ItemsChoiceType5[dgvprodutos.Rows.Count];

    If you found this post helpful, please "Vote as Helpful". If it actually answered your question, remember to "Mark as Answer".

    Se achou este post útil, por favor clique em "Votar como útil". Se por acaso respondeu sua dúvida, lembre de "Marcar como Resposta".

    sexta-feira, 11 de novembro de 2016 14:29
  • Juliano, troquei pra essa forma, não me informou nenhum erro, porém não foi adicionado os itens no XML.

    a parte de reboque, placa, uf não é adicionada.

    Obrigado.

    sexta-feira, 11 de novembro de 2016 14:36
  • A parte que atribui o objeto veiculo a uma posição do array na propriedade Items também estava comentada 

    //transp.Items[ind] = veiculo;

    Você removeu o comentário nesta parte também?


    If you found this post helpful, please "Vote as Helpful". If it actually answered your question, remember to "Mark as Answer".

    Se achou este post útil, por favor clique em "Votar como útil". Se por acaso respondeu sua dúvida, lembre de "Marcar como Resposta".


    sexta-feira, 11 de novembro de 2016 14:40
  • Juliano, quando eu adiciono somente uma linha no grid, ele funciona e gera o XML normalmente, porém quando eu coloco mais de uma linha, me informa esse erro :Additional information: O índice estava fora dos limites da matriz.

    Obrigado pela paciência!

    sexta-feira, 11 de novembro de 2016 16:14
  • Mariana,

    Como está o código neste momento?


    If you found this post helpful, please "Vote as Helpful". If it actually answered your question, remember to "Mark as Answer".

    Se achou este post útil, por favor clique em "Votar como útil". Se por acaso respondeu sua dúvida, lembre de "Marcar como Resposta".

    sexta-feira, 11 de novembro de 2016 16:18
  • Ficou assim o código da parte de reboque:

     if (dgvreboque.Rows.Count > 0)
                        {
                            transp.Items = new TVeiculo[dgvreboque.Rows.Count];
                            transp.ItemsElementName = new ItemsChoiceType5[dgvreboque.Rows.Count];
                            int ind = 0;
                            foreach (DataGridViewRow row in dgvreboque.Rows)
                            {
                                TVeiculo veiculo = new TVeiculo();
                                veiculo.placa =  dgvreboque.CurrentRow.Cells[1].Value.ToString();
                                veiculo.UF = (TUf)Enum.Parse(typeof(TUf), dgvreboque.CurrentRow.Cells[2].Value.ToString());
                                veiculo.RNTC = dgvreboque.CurrentRow.Cells[3].Value.ToString();
                                transp.Items[ind] = veiculo;
                                transp.ItemsElementName[0] = ItemsChoiceType5.reboque;
                                ind++;
                            }
                        }

    sexta-feira, 11 de novembro de 2016 16:32
  • Juliano, alterei a linha para assim : 

    e Funcionou, vou testar agora a parte de só veículo, obrigado por toda a sua ajuda.!

    transp.ItemsElementName[ind] = ItemsChoiceType5.reboque;
    sexta-feira, 11 de novembro de 2016 16:36
  • Um detalhe que percebi é que você faz o loop nas Rows do DataGridView, mas pega sempre a Row atual (dgvreboque.CurrentRow), então substitui no código abaixo.

    Tente assim:

                        if (dgvreboque.Rows.Count > 0)
                        {
                            transp.Items = new TVeiculo[dgvreboque.Rows.Count];
                            transp.ItemsElementName = new ItemsChoiceType5[dgvreboque.Rows.Count];
                            int ind = 0;
                            foreach (DataGridViewRow row in dgvreboque.Rows)
                            {
                                TVeiculo veiculo = new TVeiculo();
                                veiculo.placa =  row.Cells[1].Value.ToString();
                                veiculo.UF = (TUf)Enum.Parse(typeof(TUf), row.Cells[2].Value.ToString());
                                veiculo.RNTC = row.Cells[3].Value.ToString();
                                transp.Items[ind] = veiculo;
                                transp.ItemsElementName[ind] = ItemsChoiceType5.reboque;
                                ind++;
                            }
                        }

    O erro de intervalo inválido foi em qual das linhas? Esqueci de perguntar isto antes.


    If you found this post helpful, please "Vote as Helpful". If it actually answered your question, remember to "Mark as Answer".

    Se achou este post útil, por favor clique em "Votar como útil". Se por acaso respondeu sua dúvida, lembre de "Marcar como Resposta".

    • Marcado como Resposta Mariana C. Costa sexta-feira, 11 de novembro de 2016 17:17
    sexta-feira, 11 de novembro de 2016 16:41
  • Juliano, muito obrigado, por me informar, rsrs

    passou despercebido.

    Na parte de Veículo que é somente um item, como proceder ?

    transp.Items = new TVeiculo[0];
                                transp.ItemsElementName = new ItemsChoiceType5[0];
         
                                veiculo.placa = mplaca.Text;
                                veiculo.UF = (TUf)Enum.Parse(typeof(TUf), cbufveiculo.Text);
                                if (txtrntc.Text != "")
                                {
                                    veiculo.RNTC = txtrntc.Text;
                                }
                                transp.Items[0] = veiculo;
                                transp.ItemsElementName[0] = ItemsChoiceType5.veicTransp;


    sexta-feira, 11 de novembro de 2016 17:17
  • Neste caso seria assim:

    transp.Items = new TVeiculo[1];
                                transp.ItemsElementName = new ItemsChoiceType5[1];
         
                                veiculo.placa = mplaca.Text;
                                veiculo.UF = (TUf)Enum.Parse(typeof(TUf), cbufveiculo.Text);
                                if (txtrntc.Text != "")
                                {
                                    veiculo.RNTC = txtrntc.Text;
                                }
                                transp.Items[0] = veiculo;
                                transp.ItemsElementName[0] = ItemsChoiceType5.veicTransp;
    O valor entre colchetes (quando instanciando) indica o número de elementos no array, este foi o detalhe no seu código.


    If you found this post helpful, please "Vote as Helpful". If it actually answered your question, remember to "Mark as Answer".

    Se achou este post útil, por favor clique em "Votar como útil". Se por acaso respondeu sua dúvida, lembre de "Marcar como Resposta".


    sexta-feira, 11 de novembro de 2016 17:40
  • Juliano muito obrigado mais uma vez, por me ajudar. Funcionou perfeitamente!!! 
    sexta-feira, 11 de novembro de 2016 18:24
  • Disponha, Mariana. 

    :-)


    If you found this post helpful, please "Vote as Helpful". If it actually answered your question, remember to "Mark as Answer".

    Se achou este post útil, por favor clique em "Votar como útil". Se por acaso respondeu sua dúvida, lembre de "Marcar como Resposta".

    sexta-feira, 11 de novembro de 2016 18:29
  • Boa tarde André,

    Fui eu quem excluiu os posts, para manter a thread no assunto original (on track), de acordo com o Código de Conduta.

    Peço, por gentileza, que não volte a comentar aquilo que não está diretamente ligado com a dúvida da autora da pergunta, para que esse thread possa ser finalizada.

    Agradeço a participação.


    Robson William Silva

    Esse conteúdo é fornecido sem garantias de qualquer tipo, seja expressa ou implícita

    MSDN Community Support

    Por favor, lembre-se de Marcar como Resposta as postagens que resolveram o seu problema. Essa é uma maneira comum de reconhecer aqueles que o ajudaram e fazer com que seja mais fácil para os outros visitantes encontrarem a resolução mais tarde.

    sexta-feira, 11 de novembro de 2016 19:44
    Moderador