on 11-26-2015 1:35 PM
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);
}
}
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
You must be a registered user to add a comment. If you've already registered, sign in. Otherwise, register and sign in.
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)
You must be a registered user to add a comment. If you've already registered, sign in. Otherwise, register and sign in.
User | Count |
---|---|
98 | |
11 | |
11 | |
6 | |
6 | |
4 | |
4 | |
3 | |
3 | |
3 |
You must be a registered user to add a comment. If you've already registered, sign in. Otherwise, register and sign in.