cancel
Showing results for 
Search instead for 
Did you mean: 

Dúvida SDK

Former Member
0 Kudos

Bom dia a todos!

Gostaria de fazer a inclusão de um pedido de compra via programação. Já consigo fazer isto usando linhas simples no item, ou seja, entrando com cada linha na programação.

Mas gostaria de carregar os itens automaticamente, pegando a informação de uma grid. porém quando coloco dentro de um loop ao invés de cadastrar apenas um pedido ele gera vários pedidos com apenas dois itens em cada.

Segue meu código para análise:

private void button1_Click(object sender, EventArgs e)

        {

            this.Connect();

            int RedCode = -1;//já está setada como erro, se fosse 0 passaria direto

            string strMsg;

            try

            {

                SAPbobsCOM.Documents oPurchaseDoc;

                oPurchaseDoc = oCompany.GetBusinessObject(SAPbobsCOM.BoObjectTypes.oPurchaseOrders);

                oPurchaseDoc.CardCode = "FTSM";

                if (cmbTipoEnvio.Text == "Avião")

                {

                    oPurchaseDoc.TransportationCode = 3;

                }

                else

                {

                    oPurchaseDoc.TransportationCode = 2;

                }

                oPurchaseDoc.GroupNumber = 56;

                oPurchaseDoc.Lines.Incoterms = 0;

                oPurchaseDoc.SalesPersonCode = 2;

                //faço a conexão com a planilha e carrego o data table

                OleDbConnection conexao = new OleDbConnection(@"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + txtArquivo.Text + ";Extended Properties='Excel 12.0 Xml;HDR=YES';");

                OleDbCommand cmn = new OleDbCommand();

                cmn.CommandText = ("select [PART NUMBER], [VALOR UNITÁRIO], [QTD MERC] from [Exemplo1$]");

                cmn.CommandType = CommandType.Text;

                cmn.Connection = conexao;

                cmn.Connection.Open();

                OleDbDataReader dr1;

                dr1 = cmn.ExecuteReader();

                DataTable dt = new DataTable();

                dt.Load(dr1);

                int cont;

                cont = 0;

                foreach (DataRow Linha1 in dt.Rows)

                {

                    //aqui começa o cadastro das linhas do detalhe do pedido de compra. Quando a tabela está vazia eu uso o add, depois apenas incluo normalmente.

                    //Então tenho que usar o dt.rows.count > 0 para testar

                    if (cont == 0)

                    {

                        oPurchaseDoc.Lines.ItemCode = Linha1[0].ToString();

                        oPurchaseDoc.Lines.Price = Convert.ToDouble(Linha1[1].ToString());

                        oPurchaseDoc.Lines.Quantity = Convert.ToDouble(Linha1[2].ToString());

                        //oPurchaseDoc.Lines.Add();

                        cont = cont + 1;

                    }

                    else

                    {

                        //este é o bloco que não precisa do add.

                        oPurchaseDoc.Lines.ItemCode = Linha1[0].ToString();

                        oPurchaseDoc.Lines.Price = Convert.ToDouble(Linha1[1].ToString());

                        oPurchaseDoc.Lines.Quantity = Convert.ToDouble(Linha1[2].ToString());

                      

                    }

                  

                }

                RedCode = oPurchaseDoc.Add();

                cmn.Connection.Close();

                if (RedCode != 0) //!= quer dizer diferente

                {

                    strMsg = oCompany.GetLastErrorDescription();

                }

                else

                {

                    strMsg = "Pedido de Compra - " + oCompany.GetNewObjectKey() + " Criado com sucesso";

                }

                MessageBox.Show(strMsg);

            }

            catch (Exception ex)

            {

                MessageBox.Show(ex.Message);

            }

        }

Accepted Solutions (0)

Answers (2)

Answers (2)

former_member185682
Active Contributor
0 Kudos

Boa tarde Alexandre,

Como o falou você necessita dar o Objeto.Lines.Add() toda vez que você vai inserir uma nova linha no seu pedido.

Se a linha já existe no pedido e você quer altera-lá, você precisa usar o método Lines.SetCurrentLine(index da sua linha).

Obs.: Quando você instancia um documento, a primeira linha por padrão já está aberta, você só precisar usar o Objeto.Lines.Add() a partir da necessidade de inserção de mais de uma linha.

Att,

Diego Lother

fbio_bilicki
Active Contributor
0 Kudos

Bom dia,

já gravei esboço, e sempre dou o Lines.Add no loop do grid, ele só vai adicionar mesmo quando for o Add final.

// Um pedaço do cabeçalho

    oEsboco.CardCode = CardCode;

    oEsboco.HandWritten = SAPbobsCOM.BoYesNoEnum.tNO;

    oEsboco.DocObjectCode = BoObjectTypes.oOrders;

oEsboco..DocDate = DateTime.Today;
          

    itens = 0;

    foreach (dsDados.MEUSDADOSRow rowNovo in dtNovo)  // aqui pode ser o seu grid, tanto faz,

    {

   itemcode = rowNovo.ItemCode;
   Quantity = Convert.ToDouble(rowNovo.Quantidade);
   usage = "24";
   SubCatNum = rowNovo.Artigo;
  
   oEsboco.Lines.ItemCode = itemcode;
   oEsboco.Lines.Quantity = Quantity;
   oEsboco.Lines.Usage = usage;
   oEsboco.Lines.SupplierCatNum = SubCatNum;
   oEsboco.Lines.FreeText = FreeText;
   oEsboco.Lines.VendorNum = "";
   oEsboco.Lines.SalesPersonCode = slpCode;

   oEsboco.Lines.VatGroup = "6101-004";
   oEsboco.Lines.TaxCode = "6101-004";
  
   // campos especificos do PV
   oEsboco.Lines.UserFields.Fields.Item("U_CSTIPI").Value = "55";
   oEsboco.Lines.UserFields.Fields.Item("U_CSTPIS").Value = "09";
   oEsboco.Lines.UserFields.Fields.Item("U_CSTCOFINS").Value = "09";
   oEsboco.Lines.UserFields.Fields.Item("U_UPPediPn").Value = U_UPPediPn;

   oEsboco.Lines.Add();
   itens += 1;

    }

    if (itens > 0)

   lRetCode = oEsboco.Add(); //Tenta adicionar o Esboço no Banco de Dados
  

    // resto do programa

Fabio

SAP 9.0 PL15 / SAP 9.1 PL8 (Test)