Ir para conteúdo
Fórum Script Brasil

namon

Membros
  • Total de itens

    13
  • Registro em

  • Última visita

Posts postados por namon

  1. Para importar uma planilha excel para MDB via código, posso utilizar o código abaixo:

    -----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

    Private Sub cmdexecuta_Click()

    Dim rsdados As Recordset

    Dim x As Object

    Dim linha As Integer

    Dim strvalor_A As String, strvalor_B As Integer, strvalor_C As String

    Set x = CreateObject("Excel.Application.8") 'para o office 97/2000

    x.Workbooks.Open(App.Path & "\Clientes.xls"

    x.Sheets("Clientes").Select

    x.Visible = False

    For linha = 2 To 10 '65536 e o valor maximo

    strvalor_A = x.rows(linha).cells(1).Value 'campo1

    strvalor_B = x.rows(linha).cells(2).Value 'campo2

    strvalor_C = x.rows(linha).cells(3).Value 'campo3

    If strvalor_A = "FLAG" Then

    Exit For

    Else

    sSQl = "INSERT INTO TabelaClientes (campo1 ,campo2 , campo3 )"

    sSQl = sSQl & " VALUES ( '" & strvalor_A & "', '" & strvalor_B & "' ,'" & strvalor_C & "' ) "

    Set rsdados = db.Execute(sSQl)

    End If

    Next

    x.ActiveWorkbook.Close

    x.quit

    'Abro um modulo colocando o seguinte codigo

    Option Explicit

    Public db As ADODB.Connection

    Sub AbreBanco()

    Dim sPath As String

    Set db = New ADODB.Connection

    sPath = App.Path & "\dados.mdb"

    db.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & sPath

    End Sub

    -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------No entanto a planilha que preciso importar contém dados em várias linhas para um mesmo cliente, a saber:

    Cabeçalho

    Nome cliente(A1) CodCli (B1) valor_a(C1) valor_b(D1) valor_c(E1) valor_d(F1) totalgeral(G1)

    cliente1 (A2) 100005(B2) 0,00(C2) 0,00(D2) 1200,00(E2) 0,00(F2) 1442,00(G2)

    cliente1 (A3) 100005(B3) 0,00(C3) 0,00(D3) 0,00(E3) 0,00(F3) 0,00(G3)

    cliente1 (A4) 100005(B4) 70,00(C4) 0,00(D4) 0,00(E4) 0,00(F4) 0,00(G4)

    cliente1 (A5) 100005(B5) 0,00(C5) 52,00(D5) 0,00(E5) 0,00(F5) 0,00(G5)

    cliente1 (A6) 100005(B6) 0,00(C6) 0,00(D6) 0,00(E6) 120,00(F6) 0,00(G6)

    cliente2 (A7) 190032(B7) 0,00(C7) 97,70(D7) 0,00(E7) 0,00(F7) 487,70(G7)

    cliente2 (A8) 190032(B8) 315,00(C8) 0,00(D8) 0,00(E8) 0,00(F8) 0,00(G8)

    cliente2 (A9) 190032(B9) 0,00(C9) 0,00(D9) 0,00(E9) 75,00(F9) 0,00(G9)

    cliente3(A10)... e assim sucessivamente

    8-> A soma de todos os valores de cada cliente fica somente na Célua G(x), primeira linha de cada cliente

    -> a quantidade de cada cliente varia conforme os valores que possui em carteira, no máximo de 5 linhas/cliente

    No exemplo acima: o cliente1 possui 5 linhas; já o cliente2 possui 3 linhas apenas

    Preciso que a rotina importe uma linha para cada cliente, somando TODOS os valores por cliente:

    cliente1 (A2) 100005(B2) 70,00(C2) 52,00(D2) 1200,00(E2) 120,00(F2) 1442,00(G2)

    cliente2 (A7) 190032(B7) 315,00(C7) 97,70(D7) 0,00(E7) 75,00(F7) 487,70(G7)

    É possível via código no VB6??

    Quanto à tabela do MDB no VB6, chama-se CredDeb com a seguinte estrutura:

    Tabela: CredDeb

    Indices: Cod_cliente - Primário

    Nome_cliente

    Campos: Cod_cliente Texto/8

    Nome_cliente Texto/70

    Credito1 Dupla/10

    Credito2 Dupla/10

    Credito3 Dupla/10

    Credito3 Dupla/10

    Credito4 Dupla/10

    Credito5 Dupla/10

    Cregeral Dupla/10

  2. Boa noite Kuroi,

    Fiz o teste mas não funcionou!

    Esse formulário com o Grid que utilizo é o padrão do VB6 (DataGrid) e não o MSFlexGrid. Trata-se de uma formulário que é alimentado por Importação de arquivo TXT e não permite alterações, somente visualização, razão pelo qual utilizo o DataGrid.

    Essa rotina que você me passou, como fica para o DataGrid?

    Agradeço!

    Enéa

  3. hum, tem como postar o codigo??

    seria vba dentro de qual programa??

    Re: Help in Msflexgrid

    --------------------------------------------------------------------------------

    VB Code:

    Option Explicit
    
    Private Sub Command1_Click()
        '1st parameter is the first column and the 2nd one is the last column
        'the result is calculated between those two columns, including both of theme
        Text1.Text = getColumnSum(MSFlexGrid1, 0, 1)
        Text2.Text = getColumnSum(MSFlexGrid1, 2, 8)
    End Sub
    
    Private Function getColumnSum(mfg As MSFlexGrid, clmn1 As Integer, clmn2 As Integer) As Double
        Dim i As Integer, j As Integer
            For i = clmn1 To clmn2
                With mfg
                    .Col = i
                        For j = 0 To .Rows - 1
                            .Row = j
                            getColumnSum = getColumnSum + Val(.Text)
                        Next j
                End With
            Next
    End Function

    -> É no MSFLEXGrid

  4. VB - Como somar colunas do GRID (filho) e alimentar campo do PAI.

    Já tentei de várias formas, inclusive com a função MeuGrid.GetColumnSum(Coluna), mas apenas o primeiro registro da tabela é transportado.

    Se alguém puder me ajudar, agradeço.

    namon

    namon@uai.com.br

  5. namon, então acho q o negocio ta nessa linha agora:

    If PAI!Codigo = FILHO!Codigo And FILHO!Tppar = 1 Then
    imagino q o codigo do pai não bate com o codigo do filho a partir do segundo registro. você tem certeza q os dados tão vindos ordenados?? pra garantir você podia fazer assim na hora de abrir:
    Set PAI = vgDb.OpenRecordSet("Select * From PAI Order By Codigo", dbOpenTable)
    If PAI.RecordCount > 0 Then
    PAI.MoveFirst
    Set FILHO = vgDb.OpenRecordSet("Select * From FILHO Order By Codigo", dbOpenTable)
    If FILHO.RecordCount > 0 Then
    FILHO.MoveFirst
    assim, eles virao ordenados pelo codigo. agora, se por exemplo, um pai tiver mais de um filho, esse seu codigo não vai funcionar tb. porque por exemplo, se você ta no primero registro. codigo 1 no pai e codigo 1 no filho. ele faz o update td certinho. e ai você da o movenext no pai e no filho. o pai vai pro codigo 2. mas o filho tem outro codigo 1. os codigos não vao bater e não vai atualizar nd. então ele da outro movenext. o pai vai pro codigo 3 e o filho vai pro 2. não vai bater de novo e assim por diante. e uma coisa q você pode fazer em casos desse tipo é debugar o codigo. por exemplo, pare o cursor na linha onde diz Do While Not FILHO.EOF e aperte F9. a linha deve ficar vermelha. ai rode o programa com F5. quando chegar nessa parte do codigo, o programa deve pausar. ai se você ir apertando F8 ele vai avancando linha por linha, e você pode ver por exemplo, se ele ta entrando no if. e não é so isso, se você parar o mouse em cima das variaveis no codigo, ele deve mostrar o tooltiptext mostrando o valor dela no momento. e ainda, se você apertar Ctrl + G, você vai chamar a immediate window, onde você pode executar algum codigo q precisar. exemplo, se dentro dela, você digitar:
    ? PAI!Codigo
    e apertar Enter, ele vai te mostrar qual o Codigo do PAI no registro atual. inclusive no Immediate, você consegue executar funcoes e metodos de objetos e etc. veja ai o q q da, qualquer coisa poste.
    Kuroi, agora "pirei". Efetuei as alterações:
    Set PAI = vgDb.OpenRecordSet("Select * From PAI Order By Codigo", dbOpenTable)
    If PAI.RecordCount > 0 Then
    PAI.MoveFirst
    Set FILHO = vgDb.OpenRecordSet("Select * From FILHO Order By Codigo", dbOpenTable)
    If FILHO.RecordCount > 0 Then
    FILHO.MoveFirst

    Apliquei F9 na linha Do While Not FILHO.EOF e executei.

    Apertando F8 a rotina pula para RollBack e apresenta a mensagem de erro:

    "Não foi possível atualizar o arquivo TXT

    Motivo:

    O mecanismo de banco de dados Microsoft Jet não pôde encontrar o objeto 'Select * FROM Familia Order By Codigo'. Certifique-se de que o objeto exista e de ter digitado seu nome e o caminho corretamernte.

    Existe o Campo codigo nas duas tabelas; são chaves primárias e na rotina anterior ele atualizava o primeiro registro

    Não entendi nada!!!

  6. acho q o erro ta nessa linha aqui:

    .BookMark = .LastModified

    se não me engano, a propriedade bookmark serve pra mover pra um registro especifico, e ai no caso ele da o movenext e logo em seguida volta pro ultimo registro modificado, q acaba sendo alterado de novo e assim vai.

    retire aquela linha e tente de novo.

    Kuroi,

    Eliminei a linha indicada, mas continua somente PROCESSANDO a alteração no PRIMEIRO registro!

    A seqüência (ordem) dos comandos estariam errados?

    namon

  7. é o PAI q você ta editando, mas você nunca da MoveNext nele. então ele não sai da primera linha.

    o primero registro esta sendo editado varias vezes (cada vez com os dados de um registro do FILHO), mas os demais registros não estao sendo editados.

    Obrigado Kuroi!

    Fiz algumas alterações mas continua atualizando somente o primeiro registro. Veja abaixo as alterações:

    BeginTrans
    Set PAI = vgDb.OpenRecordSet("PAI", dbOpenTable)
    If PAI.RecordCount > 0 Then
     PAI.MoveFirst
    Set FILHO = vgDb.OpenRecordSet("FILHO", dbOpenTable)
    If FILHO.RecordCount > 0 Then
     FILHO.MoveFirst
    Do While Not FILHO.EOF
     With PAI
      .Edit
      If PAI!Codigo = FILHO!Codigo And FILHO!Tppar = 1 Then
       PAI!Ident = FILHO!Ident
       PAI!Nome = FILHO!Nome
       PAI!TotalDespesas = FILHO!Despesas
       PAI!TotalReceitas = FILHO!Receitas
       PAI!TotalPessoas = FILHO!Qtpessoas
      End If
      .Update
      PAI.MoveNext
      FILHO.MoveNext
      .BookMark = .LastModified
     End With
    Loop
    End If
    End If
    CommitTrans
    
    End Sub

  8. Em meu projeto (Formulário em GRID- PAI e FILHO). Inseri uma rotina para atualizar um campo do PAI a partir FILHO, segundo condições.

    Importa um arquivo TXT para um MDB com mais de 18 mil registros.

    Após isso, necessito atualizar alguns campos do PAI que vieram preenchidos no FILHO pela importação.

    Nesse exemplo, 4 campos no PAI a serem atualizados:

    a) Campo Ident (IDENTIFICADOR do Responsável) que está em UMA LINHA do Grid FILHO (somente um é o respsonsável)

    B) Campo Receitas que é a soma de determinada coluna do Grid FILHO;

    c) Campo Despesas que é a soma de determinada coluna do Grid FILHO;

    e) Campo TotalPessoas que é a contagem das pessoas do Grid FILHO

    Com a rotina abaixo esperava atualizar cada registro do PAI um a um e não consegui nem mesmo para o primeiro campo, pois ao rodar a rotina, apenas atuliza o primeiro Ident do PAI e os demais permanecem em branco.

    Rotina: (fragmento)

    BeginTrans
    Set PAI = vgDb.OpenRecordSet("FILHO", dbOpenTable)
    If PAI.RecordCount > 0 Then
      PAI.MoveFirst
    Set FILHO = vgDb.OpenRecordSet("FILHO", dbOpenTable)
    If FILHO.RecordCount > 0 Then
    FILHO.MoveFirst
    Do While Not FILHO.EOF
    With PAI
      .Edit
      If PAI!Codigo = FILHO!Codigo Then 
       PAI!Ident = FILHO!Ident
       PAI!Nome = FILHO!Nome
       PAI!ReceitasTotais = FILHO!Receitas
       PAI!DespesasTotais = FILHO!Despesas
      End If 
      .Update
      .BookMark = .LastModified
    End With
    End If
    FILHO.MoveNext
    Loop
    End If
    End If
    CommitTrans
    
    End Sub

    Executando a rotina, apenas o PRIMEIRO registro é atualizado dando a impressão que não percorre a TABELA Registro por Registro.

    Onde está o meu erro e como corrigir?

    namon

×
×
  • Criar Novo...