Usuário com melhor resposta
Grupo Veiculo e Reboque NF-e

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.
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".
- Editado Juliano Nunes Silva Oliveira sexta-feira, 11 de novembro de 2016 14:40
- Marcado como Resposta Mariana C. Costa 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
-
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".
- Editado Juliano Nunes Silva Oliveira sexta-feira, 11 de novembro de 2016 17:41
- Marcado como Resposta Mariana C. Costa sexta-feira, 11 de novembro de 2016 18:23
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 -
-
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".
- Editado Juliano Nunes Silva Oliveira sexta-feira, 11 de novembro de 2016 13:49
-
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 -
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.
-
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".
- Editado Juliano Nunes Silva Oliveira sexta-feira, 11 de novembro de 2016 14:10
-
-
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".
- Editado Juliano Nunes Silva Oliveira 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; } } }
-
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".
-
-
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".
- Editado Juliano Nunes Silva Oliveira sexta-feira, 11 de novembro de 2016 14:40
- Marcado como Resposta Mariana C. Costa sexta-feira, 11 de novembro de 2016 16:36
-
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!
-
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".
-
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++; } }
-
-
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
-
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;
- Editado Mariana C. Costa sexta-feira, 11 de novembro de 2016 17:23
-
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".
- Editado Juliano Nunes Silva Oliveira sexta-feira, 11 de novembro de 2016 17:41
- Marcado como Resposta Mariana C. Costa sexta-feira, 11 de novembro de 2016 18:23
-
-
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".
-
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.