namon
-
Total de itens
13 -
Registro em
-
Última visita
Posts postados por namon
-
-
Obrigado Kuroi!
você é fera!
Alguns ajuste vou ter que fazer ainda, mas já dei o pontepé inicial com seus esclarecimentos
Abraços
Enéa
-
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
-
Obrigado Kuroi!
Vou testar e posto aqui!
Até amanhã e abraços!
-
Kuroi,
Na realidade tentei de TUDO, inclusive adptar esse codigo que passei. Mas não consegui com nada!
E mão tenho nenhuma idéia de como conseguir. Já vasculhei a nete não encontrei nada específico!
-
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
-
mas q grid é esse q você usa?? datagrid?? msflexgrid??
não conheco esse metodo GetColumnSum() e tb não o encontrei em nenhum desses dois grids.
Prezado Kuroi,
Encontrei num fragmento de uma função em VBA (apenas anotei, há algum tempo).
Enéa
-
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
-
Kuroi,
Exatamente o que disseste!
Percorri o arquivo TXT e eis que encontro duplicidade.
Obrigado pela força
TÓPICO ENCERRADO! :rolleyes:
-
Kuroi, agora "pirei". Efetuei as alterações: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.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!!!
-
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
-
é 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
-
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
VB6 - Importar planilha Excel para o MDB Access
em Visual Basic
Postado
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