Este fórum está sendo desativado

Depois de 9 anos, este fórum será desativado. Mas calma.... estamos migrando para uma comunidade no DISCORD. Junte-se a nós.

ENTRAR PARA DISCORD

Tópicos relacionados a códigos VBA, gravação de macros, etc.
  • Avatar do usuário
  • Avatar do usuário
#18134
Boa tarde pessoal!

Tenho uma planilha onde faço toda a gestão de estoques da empresa onde trabalho e estou inserindo um módulo de recebimento de pedidos. Nessa pasta tenho uma rotina que faz a emissão dos pedidos e os envia para os fornecedores por email e quero criar um método para efetuar o recebimento desses pedidos. Para isso, preciso de uma ajuda para criar uma rotina que retorne todos os itens da ordem de compra que informar e após preencher todos os dados, outra rotina retire do "estoque fantasma" e jogue no estoque real.

1) Toda vez que emito uma ordem de compra nova, essa rotina faz o lançamento dos itens dessa ordem em um "estoque fantasma" que contém apenas os itens que foram feito pedidos;
2) Cada ordem de compra possui um número único, através desse número que pretendo fazer a busca no banco de dados;

O que pretendo:
Criar duas rotinas, uma que faça a busca e retorne o saldo dos itens daquela ordem de compra e outra que faça o lançamento dos itens que marcar por meio de uma caixa de seleção.

Criei um exemplo que está em anexo dessa situação, nele possui duas abas, a aba "Ped_rec" que é onde informarei o número da ordem de compra e buscarei no banco de dados, preencher os dados da nota fiscal e fazer o lançamento em si. E a outra aba é a "Bd", que é o banco de dados, o estoque fantasma que citei, que é onde a rotina irá buscar os dados da ordem de compra.

Vamos considerar o seguinte exemplo:

Emiti uma ordem de compra para 100 canetas azul.
Meu fornecedor as enviou em duas remessas, primeiro 50 unidades e 5 dias depois as outras 50. Assim que recebo as 50 primeiras, faço o lançamento normal em estoque e fico com 50 de saldo aguardando o envio.
Assim que o fornecedor enviar o restante, faço o segundo lançamento para aquela ordem de compra, finalizando assim as 100 unidades.

Como estava pensando fazer:
1) Informo o número da ordem de compra que o fornecedor mencionou na nota fiscal e chamo a rotina que buscará os dados daquela ordem de compra na aba Bd através do botão "CONSULTAR ORDEM DE COMPRA";
2) Preencho o cabeçalho com os dados da nota fiscal, data de recebimento e o nome do responsável pelo lançamento;
3) Informo os itens que foram enviados marcando-os através de uma caixa de seleção para item e informo a quantidade enviada e o valor unitário de cada item;
4) Após tudo preenchido, chamo outra rotina que faz o lançamento em estoque e faz a baixa (parcial ou total) da ordem de compra no Bd através do botão "REALIZAR LANÇAMENTO".

Alguém consegue me ajudar com essa rotina?

Desde já, obrigado.
Você não está autorizado a ver ou baixar esse anexo.
Avatar do usuário
Por DJunqueira
Avatar
#18137
CleuberZago, gostaria de te chamar atenção q uma nota de compra em geral redunda em duas tabelas, uma com os dados do comprador e outra com os itens comprados, do contrário se cria muitas redundâncias q retardam o trabalho.

No caso da sua planilha por exemplo, as 4 primeiras colunas da aba Dd tem itens q se repetem desnecessariamente. Vc até pode montar uma estrutura q de conta de vincular as duas tabelas resultantes de uma nota de compra no Excel, mas o Access é a ferramenta mais adequada, na minha opinião, p/ isso q vc quer fazer.
#18140
Boa noite Junqueira, obrigado pelo retorno.

Quanto às redundâncias, acredito que esse até não seja o maior problema, pois no caso sou o dono dos dois processos: o de compra e o de controle e acredito que justamente por isso elimine o excesso de tabelas. Talvez uma adaptação entre elas sim.

Sem sombras acredito que o access seja o mais adequado, mas esbarro no conhecimento.. rsrs
Esse modelo que compartilhei seria só um esboço para a ajuda com as duas rotinas, acredito que muita coisa entre ou saia conforme for me esclarecendo melhor sobre o pretendido.
#18220
Toda a parte de pesquisa consegui finalizar, agora é só a parte que envolve o banco de dados no access...

Alguém conseguiria me ajudar? De access entendo tanto quanto de medicina...
#18224
Segue anexo.

Retirei tudo que não tinha necessidade com o que preciso e deixei só a parte de busca mesmo.

Daí o que falta é a parte que após preencher os dados da aba "Ped_rec", a rotina vinculada ao botão "REALIZAR LANÇAMENTO" preencha apenas os itens que estão marcados como ok no banco de dados do access...
Você não está autorizado a ver ou baixar esse anexo.
#18250
Montei um exemplo simples com a planilha q vc forneceu e mesmo assim tive de acrescentar pelo menos mais duas tabelas.
De qq forma é um bom começo p/ vc refletir melhor como vc quer montar essa Ordem de Compra.
Você não está autorizado a ver ou baixar esse anexo.
#18256
Bom dia, Junqueira!

Agradeço muito sua ajuda, mas acho que não entendeu muito o que gostaria de fazer... rsrs
Na verdade preciso de uma rotina que faça a interação Excel x Access pois já tenho um "sistema" que faz todo o gerenciamento do estoque e dos pedidos no Excel...

Através dessa rotina irei fazer os lançamentos das ordens de compra que já emiti pelo Excel e que estou recebendo dos fornecedores. Posterior a isso, a rotina irá alimentar o estoque no banco de dados do Access.

Basicamente, a rotina tem que fazer alimentar o banco de dados do Access com as informações que preenchi na aba "Ped_rec" e diminuir as quantidades da base "Ped_itens"...
#18274
Boa tarde!!

Eu fiz um modelo usando apenas 3 campos de sua guia Bd
Favor adaptar ao seu caso e fazer as devidas referências:
Microsfot ActiveX Data Objects 2.7 Library
Microsoft DAO 3.6 Object Library
No meu exemplo eu usei o formato .mdb, verifique o formato do seu banco.
Código: Selecionar todos
Sub ADOFromExcelToAccess()
'Fonte: http://www.exceltip.com/import-and-export-in-vba/export-data-from-excel-to-access-ado-using-vba-in-microsoft-excel.html
'exports data from the active worksheet to a table in an Access database
'this procedure must be edited before use
Dim cn As ADODB.Connection, rs As ADODB.Recordset, r As Long
'connect to the Access database
Set cn = New ADODB.Connection
cn.Open "Provider=Microsoft.Jet.OLEDB.4.0; " & "Data Source=C:\Users\saico\Documents\alevbaDB.mdb;"
'open a recordset
Set rs = New ADODB.Recordset
rs.Open "Table1", cn, adOpenKeyset, adLockOptimistic, adCmdTable
'Use a linha abaixo para remover os dados
With cn
    .Execute "DELETE * FROM Table1"
End With
'all records in a table
r = 2 'the start row in the worksheet
    Do While Len(Range("A" & r).Formula) > 0
        'repeat until first empty cell in column A
        With rs
            .AddNew 'create a new record
            'add values to each field in the record
            .Fields("Data") = Range("A" & r).Value
            .Fields("Nº Ordem") = Range("B" & r).Value
            .Fields("Emitente") = Range("C" & r).Value
            'add more fields if necessary…
            .Update 'stores the new record
        End With
        r = r + 1 'next row
    Loop
rs.Close
Set rs = Nothing
cn.Close
Set cn = Nothing
End Sub
Att
#18287
PERFEITO, Alexandre! Muito obrigado...

Na mesma linha desse código que vc fez, estou adaptando outro para fazer a relação inversa com o Access. Esse vai puxar os dados de acordo com determinado criterio que eu definir, criterio esse que é variavel.

Só que não consegui adaptar dentro desse código que o criterio seja vinculado a alguma célula, por exemplo, ele só permite que o criterio seja escrito dentro do codigo...

Como posso fazer?
Código: Selecionar todos
'~~> Remove all references as the below code uses Late Binding with ADO.
Sub teste()
          Dim cn As Object, rs As Object
          Dim intColIndex As Integer
          Dim DBFullName As String
          Dim TargetRange As Range

10        DBFullName = "C:\Users\zagocl.PHIBRED\Desktop\Database1.mdb"

20        On Error GoTo Whoa

30        Application.ScreenUpdating = False

40        Set TargetRange = Sheets("Plan1").Range("A1")


50        Set cn = CreateObject("ADODB.Connection")
60        cn.Open "Provider=Microsoft.Jet.OLEDB.4.0; Data Source=" & DBFullName & ";"

70        Set rs = CreateObject("ADODB.Recordset")
80        rs.Open "SELECT * FROM Fornecedores WHERE Emitente = 'FULANO'", cn, , , adCmdText

          ' Write the field names
90        For intColIndex = 0 To rs.Fields.Count - 1
100           TargetRange.Offset(1, intColIndex).Value = rs.Fields(intColIndex).Name
110       Next

          ' Write recordset
120       TargetRange.Offset(1, 0).CopyFromRecordset rs

LetsContinue:
130       Application.ScreenUpdating = True
140       On Error Resume Next
150       rs.Close
160       Set rs = Nothing
170       cn.Close
180       Set cn = Nothing
190       On Error GoTo 0
200       Exit Sub
Whoa:
210       MsgBox "Error Description :" & Err.Description & vbCrLf & _
             "Error at line     :" & Erl & vbCrLf & _
             "Error Number      :" & Err.Number
'220       Resume LetsContinue
End Sub
long long title how many chars? lets see 123 ok more? yes 60

We have created lots of YouTube videos just so you can achieve [...]

Another post test yes yes yes or no, maybe ni? :-/

The best flat phpBB theme around. Period. Fine craftmanship and [...]

Do you need a super MOD? Well here it is. chew on this

All you need is right here. Content tag, SEO, listing, Pizza and spaghetti [...]

Lasagna on me this time ok? I got plenty of cash

this should be fantastic. but what about links,images, bbcodes etc etc? [...]

Estamos migrando para uma comunidade no Discord