Ir para conteúdo
Fórum Script Brasil

Xistyle

Membros
  • Total de itens

    355
  • Registro em

  • Última visita

Tudo que Xistyle postou

  1. juninn obrigado pela resposta! Tentei este código também mas não funcionou. Devo adicionar algum NameSpace? Pois o VB.NET não reconhece o Font(). PS: fiz a alteração na grid diretamente pelas propriedades! Obrigado! Mas é só a critério de curiosidade mesmo... nunca se sabe quando teremos que usar esse recurso desta forma ;)
  2. Prezados, alguém sabe como formatar o cabeçalho de um DataGridView? Preciso colocar o texto do cabeçalho em Negrito. Tentei o código abaixo mas dá erro de ReadOnly: DataGridView.ColumnHeaderDefaultCellStyle.Font.Bold = True
  3. Pessoal, boa tarde! Preciso tirar uma dúvida. Estou montando uma procedure que receberá valores dinamicamente. Isto é, alguns valores (incluindo variáveis de campos e tabelas) sofrerão alteração. Criei uma variável @SQL que é um Varchar e auxiliará na montagem da Query. A montagem da query dá-se por exemplo: SET @SQL = @SQL + ' ' + @CAMPO + ' FROM ' @TABELA Mas, basicamente minha dúvida é a seguinte: como eu atribuo o valor resultante dessa variável @SQL para uma outra variável? Tentei usar um SET @TOTAL = EXEC (@SQL) mas não deu certo. Alguma idéia?
  4. Resolvido: Usei o esquema de somátoria (sim é tosco, mas funciona) já que as outras opções não estavam funcionando! http://www.xtremevbtalk.com/showthread.php?p=1326018
  5. Pessoal, boa noite! Preciso de uma ajuda com relação a pegar a ID correta de um processo aberto. Estou montando uma classe para exportar uma DataTable para o Excel. Porém, toda vez que a planilha é gerada, o EXCEL.EXE fica aberto na memória, mesmo dando QUIT no objeto Excel no código. Aí fiz o seguinte teste: criei uma variável do tipo Process e fiz a atribuição System.Diagnostics.Process.GetProcessByName("EXCEL").Last para pegar o último Excel aberto. A princípio deu certo: pegou o PID correto e consegui dar um Kill ao final da visualização. Contudo, abri um Excel e depois iniciei o procedimento de exportação. O resultado foi que esse método confundiu o PID, pegando o PID do Excel que abri antes da exportação. Alguma idéia de como solucionar isto? Abraços!
  6. Muda o contador para Long ao invés de Double e tenta novamente ;D
  7. Outra coisa que é interessante é, usando a idéia do Rafael, criar um campo na tabela descrição que guarde o caminho da foto e do mapa. Exemplo: Tabela Descricao Campos: IDDescricao (Chave Primária), IDCidade (Chave Estrangeira), DescricaoCidade (Campo Texto), CaminhoFoto (Campo Texto) Supondo que a cidade de Coimbra tenha uma descrição e 1 mapa e 2 fotos. Supondo também que a ID da cidade de Coimbra seja 16, teríamos a seguinte idéia, na tabela Descrição: IDDescricao IDCidade DescriçãoCidade CaminhoFoto 7 16 descrição... c:/projeto vb/fotos/foto_coimbra1.jpg 8 16 descrição... c:/projeto vb/fotos/foto_coimbra2.jpg 9 16 descrição... c:/projeto vb/fotos/mapa_coimbra.jpg É só uma idéia bem simples do banco. Depois você aprende outras formas de criar essas tabelas, de uma forma menos bagunçada :D
  8. Na verdade, realizei outros testes e o Sorted corrigiu apenas um deles. Os SubItems não são carregados, apenas o Text de cada ListItem. Sendo assim, tentei definir uma variável x como ListItem e a usei da seguinte forma: Dim x As ListView Set x = lvwDocumentos.ListItems.Add (Indice) With x .Text = "Teste" .SubItems(1) = Date .SubItems(2) = "Teste" End With Isso resolveu o problema! Inclusive, trabalhou muito bem com as API's que adicionam ícones na ListView, sem usar a ImageList.
  9. Ah não creio! O erro nem tava nessa rotina... De alguma forma, quando a rotina passava pelo '# Realiza a ordenação dos arquivos por data em que foram anexados Call lvwDocumentos_ColumnClick(lvwDocumentos.ColumnHeaders(2)) O mais esquisito é que debugando ele já apagava os dados ao adicionar um novo item. A rotina de ordenação estava assim: Private Sub lvwDocumentos_ColumnClick(ByVal ColumnHeader As MSComctlLib.ColumnHeader) If lvwDocumentos.SortKey <> ColumnHeader.Index - 1 Then lvwDocumentos.SortKey = ColumnHeader.Index - 1 lvwDocumentos.SortOrder = lvwAscending Else If lvwDocumentos.SortOrder = lvwAscending Then lvwDocumentos.SortOrder = lvwDescending Else lvwDocumentos.SortOrder = lvwAscending End If End If lvwDocumentos.Sorted = -1 End Sub Ai alterei o lvwDocumentos.Sorted = -1 por lvwDocumentos.Sorted = True e funcionou :/ Ainda tomo uns bons olé do VB :/ Obrigado kuroi!
  10. Hmmm não manjo de Oracle... vi alguma coisa bem por cima, mas vamos lá... SELECT * FROM (SELECT ROWNUM AS a, EMPRESA, CONTATO, HISTORICO, DATATAREFA, ASSESSOR, EQUIPE, CODEMP FROM CONTATOS_HISTORICO) WHERE EMPRESA = 'TESTE' AND a > ((SELECT MAX(ROWNUM) FROM CONTATOS_HISTORICO) - 5)
  11. Tenta isso ;) SELECT * FROM ( SELECT ROW_NUMBER() OVER(ORDER BY coluna1) LINENUM, coluna1, coluna2 FROM Tabela ORDER BY coluna1 ) WHERE LINENUM > ((SELECT MAX(LINENUM) FROM Tabela) - 3)
  12. Vou fazer essa verificação e dou um retorno! Obrigado kuroi ;)
  13. Sim kuroi... A "exclusão" ocorre na lvwDocumentos.ListItems.Add (lvwDocumentos.ListItems.Count + 1) Nesse momento, no Debug, o Text do item anterior e seus SubItems são apagados. Porém, ficam na listview, em branco.
  14. Xistyle

    Winsock

    lemanrus, nesse caso, você tem que ter uma DataArrival no server, da mesma forma que está client. Porém, ele vai receber a mensagem que você passou (login@senha) e ai você usa a formatação de string (pode ser um split) e armazena o login e senha num vetor. Depois disso faz a validação do login/senha no servidor, por um select no banco e manda os dados que precisa (acho que no caso a ID do Personagem (PER)) num DataSend do servidor. O client vai receber os dados pelo DataArrival e guardar as informações no vetor, como seu código mostra. Era essa a dúvida?
  15. Prezados, bom dia! Estou enfrentando mais um problema com o VB6. Estou trabalhando com a ListView, e deixando com cara de uma grid. Estou usando algumas APIs também para conseguir exibir imagens ou outros recursos. O fato é o seguinte: existe uma tela que apenas exibe uma lista de documentos (Tela Documentos). Essa tela possui um botão que leva a uma outra tela, onde é possível anexar os arquivos (Tela Profile). Um profile pode ter N arquivos. Nela posso incluir um novo arquivo a um profile já existente, criar um novo profile, excluir um profile, excluir um arquivo de um profile já existente ou ainda apenas visualizar os arquivos que estão neste profile. Podemos ilustrar o profile como se fosse uma pasta, com as mesmas permissões que o Windows provê para os usuários (alterar, editar, somente leitura). Quando eu carrego a tela de documentos, os arquivos são carregados normalmente. Porém, quando abro a tela de profiles e a fecho, após alguma operação das que citei acima (ou não fazendo nada), é chamada a rotina para carregar os documentos novamente na tela de documentos. Ao chamar a rotina, os itens são adicionados ao ListView. O primeiro item é adicionado normalmente (text e subitems). Quando o próximo item é adicionado, os valores do item anterior são apagados! Pensei que poderia ser algum problema com instância de formulários, mas não é. Abaixo segue o código com algumas explicações de rotinas: Private Sub lsubCarregarDocumentos() On Error GoTo erro Dim llngIndice As Long Dim llngIDProfile As Long Dim lfsoVerificarArquivo As FileSystemObject Dim lstrSQL As String Dim sTypeName As String Dim lstrCaminhoArquivo As String Dim sClass As String * MAX_PATH Dim lrsProfiles As ADODB.Recordset Dim lrsArquivo As ADODB.Recordset Dim lvi As LVITEM Dim ft As FILETIME Set lfsoVerificarArquivo = New FileSystemObject Me.MousePointer = vbHourglass '# Limpa o listview lvwDocumentos.ListItems.Clear lvwDocumentos.Visible = False '# Carrega dados como ID do Profile, ID do Documento, Tipo do Documento, Data em que foi anexado lstrSQL = "EXEC SEL_DOCPROCANDA " & mclsAdvProcessos.getlngIDAdv_Processo & ",NULL,NULL,NULL" '# Essa função genérica faz as verificações se existem dados e, caso existam, carrega-os no recordset If gfcnLocalizarDados(lrsProfiles, lstrSQL, 0) = True Then While Not lrsProfiles.EOF '# Essa função genérica de leitura verifica o tipo de dado do campo no banco e faz as conversões llngIDProfile = gfcnLerDado(lrsProfiles("IDDOC_PROFILE")) '# Verifica se a pasta existe (início) If lfsoVerificarArquivo.FolderExists(gtParametrosGerais.strCaminhoDocumento & gtParametrosGerais.strIdentificacaoBanco & "\" & llngIDProfile) Then '# Usada para verificação da existência do arquivo lstrSQL = "SELECT caminhodocumento FROM adv_profiledocx WHERE idadv_documento = " & gfcnLerDado(lrsProfiles("IDADV_DOCUMENTO")) If gfcnLocalizarDados(lrsArquivo, lstrSQL, 0) = True Then lstrCaminhoArquivo = gtParametrosGerais.strCaminhoDocumento & gtParametrosGerais.strIdentificacaoBanco & "\" & llngIDProfile & "\" & gfcnLerDado(lrsArquivo("CAMINHODOCUMENTO")) '# Verifica se o arquivo contido na tabela existe na pasta If lfsoVerificarArquivo.FileExists(lstrCaminhoArquivo) Then Screen.MousePointer = vbHourglass lvi.mask = LVIF_IMAGE '#Verificação nas chaves do registro (início) If (RegEnumKeyEx(HKEY_CLASSES_ROOT, 0, Right(lstrCaminhoArquivo, 4), MAX_PATH, _ 0, sClass, MAX_PATH, ft) = ERROR_SUCCESS) Then If (Asc(Trim(Right(lstrCaminhoArquivo, 4))) = vbAscDot) Then sTypeName = GetFileTypeName(Right(lstrCaminhoArquivo, 4)) If Len(sTypeName) Then lvwDocumentos.ListItems.Add lvwDocumentos.ListItems.Count + 1 lvwDocumentos.ListItems.Item(lvwDocumentos.ListItems.Count).Text = gfcnLerDado(lrsArquivo("CAMINHODOCUMENTO")) lvwDocumentos.ListItems.Item(lvwDocumentos.ListItems.Count).Tag = lstrCaminhoArquivo lvwDocumentos.ListItems.Item(lvwDocumentos.ListItems.Count).SubItems(1) = Format(gfcnLerDado(lrsProfiles("O_DATA_ANEXO")), "DD/MM/YYYY") lvwDocumentos.ListItems.Item(lvwDocumentos.ListItems.Count).SubItems(2) = mconstProcesso lvwDocumentos.ListItems.Item(lvwDocumentos.ListItems.Count).SubItems(3) = llngIDProfile lvwDocumentos.ListItems.Item(lvwDocumentos.ListItems.Count).SubItems(4) = 0 lvwDocumentos.ListItems.Item(lvwDocumentos.ListItems.Count).SubItems(5) = gfcnLerDado(lrsProfiles("TIPODOCUMENTO")) lvi.iItem = lvwDocumentos.ListItems.Count - 1 lvi.iImage = GetFileIconIndex(Mid(lstrCaminhoArquivo, InStrRev(lstrCaminhoArquivo, "\") + 1, Len(lstrCaminhoArquivo) - InStrRev(lstrCaminhoArquivo, "\")), SHGFI_ICON) Call ListView_SetItem(m_hwndLV, lvi, lvwDocumentos.ListItems.Count - 1) End If Else '# Arquivos com extensão de 3 caracteres If (Asc(Trim(Right(lstrCaminhoArquivo, 4))) = vbAscDot) Then sTypeName = GetFileTypeName(Right(lstrCaminhoArquivo, 4)) If Len(sTypeName) Then lvwDocumentos.ListItems.Add lvwDocumentos.ListItems.Count + 1 lvwDocumentos.ListItems.Item(lvwDocumentos.ListItems.Count).Text = gfcnLerDado(lrsArquivo("CAMINHODOCUMENTO")) lvwDocumentos.ListItems.Item(lvwDocumentos.ListItems.Count).Tag = lstrCaminhoArquivo lvwDocumentos.ListItems.Item(lvwDocumentos.ListItems.Count).SubItems(1) = Format(gfcnLerDado(lrsProfiles("O_DATA_ANEXO")), "DD/MM/YYYY") lvwDocumentos.ListItems.Item(lvwDocumentos.ListItems.Count).SubItems(2) = mconstProcesso lvwDocumentos.ListItems.Item(lvwDocumentos.ListItems.Count).SubItems(3) = llngIDProfile lvwDocumentos.ListItems.Item(lvwDocumentos.ListItems.Count).SubItems(4) = 0 lvwDocumentos.ListItems.Item(lvwDocumentos.ListItems.Count).SubItems(5) = gfcnLerDado(lrsProfiles("TIPODOCUMENTO")) lvi.iItem = lvwDocumentos.ListItems.Count - 1 lvi.iImage = GetFileIconIndex(Mid(lstrCaminhoArquivo, InStrRev(lstrCaminhoArquivo, "\") + 1, Len(lstrCaminhoArquivo) - InStrRev(lstrCaminhoArquivo, "\")), SHGFI_ICON) Call ListView_SetItem(m_hwndLV, lvi, lvwDocumentos.ListItems.Count - 1) End If '# Arquivos com extensão de 3 caracteres (FIM) Else '# Arquivos com extensão de 4 caracteres If (Asc(Trim(Right(lstrCaminhoArquivo, 5))) = vbAscDot) Then sTypeName = GetFileTypeName(Right(lstrCaminhoArquivo, 5)) If Len(sTypeName) Then lvwDocumentos.ListItems.Add lvwDocumentos.ListItems.Count + 1 lvwDocumentos.ListItems.Item(lvwDocumentos.ListItems.Count).Text = gfcnLerDado(lrsArquivo("CAMINHODOCUMENTO")) lvwDocumentos.ListItems.Item(lvwDocumentos.ListItems.Count).Tag = lstrCaminhoArquivo lvwDocumentos.ListItems.Item(lvwDocumentos.ListItems.Count).SubItems(1) = Format(gfcnLerDado(lrsProfiles("O_DATA_ANEXO")), "DD/MM/YYYY") lvwDocumentos.ListItems.Item(lvwDocumentos.ListItems.Count).SubItems(2) = mconstProcesso lvwDocumentos.ListItems.Item(lvwDocumentos.ListItems.Count).SubItems(3) = llngIDProfile lvwDocumentos.ListItems.Item(lvwDocumentos.ListItems.Count).SubItems(4) = 0 lvwDocumentos.ListItems.Item(lvwDocumentos.ListItems.Count).SubItems(5) = gfcnLerDado(lrsProfiles("TIPODOCUMENTO")) lvi.iItem = lvwDocumentos.ListItems.Count - 1 lvi.iImage = GetFileIconIndex(Mid(lstrCaminhoArquivo, InStrRev(lstrCaminhoArquivo, "\") + 1, Len(lstrCaminhoArquivo) - InStrRev(lstrCaminhoArquivo, "\")), SHGFI_ICON) Call ListView_SetItem(m_hwndLV, lvi, lvwDocumentos.ListItems.Count - 1) End If End If '# Arquivos com extensão de 4 caracteres (FIM) End If End If Call ListView_SetSelectedItem(m_hwndLV, 0) Call ListView_EnsureVisible(m_hwndLV, 0, False) End If '#Verificação nas chaves do registro (fim) Screen.MousePointer = vbNormal End If '# Verifica se o arquivo contido na tabela existe na pasta (FIM) End If '# Usada para verificação da existência do arquivo (FIM) End If '# Verifica se a pasta existe (FIM) If Not lrsProfiles.EOF Then lrsProfiles.MoveNext End If Wend lrsProfiles.Close End If Set lrsProfiles = Nothing Set lrsArquivo = Nothing '# Realiza a ordenação dos arquivos por data em que foram anexados Call lvwDocumentos_ColumnClick(lvwDocumentos.ColumnHeaders(2)) lvwDocumentos.Visible = True Me.MousePointer = vbDefault Exit Sub erro: Set lrsProfiles = Nothing Set lrsArquivo = Nothing Me.MousePointer = vbDefault If Err.Number = 52 Then MsgBox "Você não tem permissão para acessar a pasta de documentos do processo no servidor. Entre em contato com o administrador de rede.", vbCritical, "Zats & Loib" Else MsgErro Err.Number, Err.Description End If End Sub Alguém tem alguma idéia do que possa estar acontecendo? Achei que poderia ser algo relacionado ao listview se perder nos índices... mas nada disso. Abraços!
  16. Você teria que usar o vbCtrlMask + vbAltMask + vbKeyA... acho que isso simularia o Ctrl + Alt + A, mas não sei se irá abrir o programa. Esse aplicativo que abre com essas teclas de atalho, está em execução (running)?
  17. Senhores, consegui resolver! Apesar de ter alguns parâmetros opcionais (.CreateParameter), ele dá algum erro caso não seja passado por completo. Estranho né? Bom, além disso, tive que "calibrar" os parâmetros passados. Para os campos que são declarados como Numeric, devem ser passados a precision e scale (Campo Porcentagem Numeric(10,2)). Assim, ocorreu tudo certinho. Abaixo o código. Achei bem interessante as pesquisas que fiz e a utilidade dele. Por ser uma rotina genérica, pode ser usada facilmente. Estou terminando alguns testes (testei apenas em 2 SPs). Abraços Public Function gfcnExecutarIDAtual(ByVal lstrProcedure As String, _ ByRef lstrParametros() As String) As Single Dim llngContador As Long Dim lintTamanho As Integer Dim lintEscala As Integer Dim lstrSQL As String Dim lcmmExecute As New ADODB.Command Dim ladoParametro As New ADODB.Parameter Dim lrsDados As ADODB.Recordset Dim ladoTipo As ADODB.DataTypeEnum Dim ladoEntradaSaida As ADODB.ParameterDirectionEnum On Error GoTo erro gfcnExecutarIDAtual = 0 With lcmmExecute .ActiveConnection = gconConexao .CommandType = adCmdText lintTamanho = 0 If UBound(lstrParametros) >= 0 Then '# Retorna o nome das colunas/parâmetros da SP lstrSQL = "sp_sproc_columns " & lstrProcedure Set lrsDados = New ADODB.Recordset lrsDados.CursorType = adOpenForwardOnly lrsDados.CursorLocation = adUseClient lrsDados.LockType = adLockReadOnly lrsDados.Open lstrSQL, gconConexao, , , adCmdText If lrsDados(eParametrosSP.eNomeParametro).Value = "@RETURN_VALUE" Then lrsDados.MoveNext .CommandType = CommandTypeEnum.adCmdStoredProc .CommandText = lstrProcedure '# É adicionado mais um ao índice máximo do vetor para que seja incluído '# o parâmetro que retorna a IDAtual (@O_IDATUAL) For llngContador = 0 To (UBound(lstrParametros)) '# Verifica o tipo do parâmetro - Coluna 6 Select Case UCase(CStr(lrsDados.Fields.Item(eParametrosSP.eTipoParametro))) Case "INT" ladoTipo = ADODB.DataTypeEnum.adInteger Case "NUMERIC" ladoTipo = ADODB.DataTypeEnum.adNumeric Case "VARCHAR" ladoTipo = ADODB.DataTypeEnum.adVarChar End Select '# Recebe o tamanho máximo do campo lintTamanho = lrsDados(eParametrosSP.eTamanhoCampo).Value '# Verifica se é um parâmetro de Entrada ou Saída If Mid(CStr(lrsDados(eParametrosSP.eNomeParametro).Value), 1, 2) = "@I" Then ladoEntradaSaida = ADODB.ParameterDirectionEnum.adParamInput Else ladoEntradaSaida = ADODB.ParameterDirectionEnum.adParamOutput End If '# O parâmetro de saída (retorno) não passa valores If ladoEntradaSaida <> ADODB.ParameterDirectionEnum.adParamOutput Then .Parameters.Append .CreateParameter(lrsDados(eParametrosSP.eNomeParametro).Value, ladoTipo, ladoEntradaSaida, lintTamanho, IIf(UCase(lstrParametros(llngContador)) = "NULL", 0, lstrParametros(llngContador))) '# Recebe a escala e precisão, caso haja If ladoTipo <> ADODB.DataTypeEnum.adVarChar Then .Parameters.Item(llngContador).Precision = lintTamanho .Parameters.Item(llngContador).NumericScale = lrsDados(eParametrosSP.eEscala).Value End If Else .Parameters.Append .CreateParameter(lrsDados(eParametrosSP.eNomeParametro).Value, ladoTipo, ladoEntradaSaida, lintTamanho) '# Recebe a escala e precisão, caso haja If ladoTipo <> ADODB.DataTypeEnum.adVarChar Then .Parameters.Item(llngContador).Precision = lintTamanho .Parameters.Item(llngContador).NumericScale = lrsDados(eParametrosSP.eEscala).Value End If End If lrsDados.MoveNext Next End If .Execute gfcnExecutarIDAtual = .Parameters("@O_IDATUAL") End With Set lrsDados = Nothing Set lcmmExecute = Nothing Set ladoParametro = Nothing Exit Function erro: Set lcmmExecute = Nothing gfcnExecutarIDAtual = False frmErro.letstrCodigoErro = Err.Number frmErro.letstrDescricaoErro = Err.Description & vbCrLf & "Instrução: gfcnExecutarIDAtual" End Function
  18. kuroi, eParametroSP é meu Enum, pra que seja fácil de identificar as colunas que ele retorna com a função sp_sproc_columns. gabriel, Vou dar uma olhada! Obrigado!
  19. Valeu gabriel mas não ajudou muito não cara... o tipo de conexão ADODB usada pelo .NET é diferente do VB6 :/ Em si, não existe erro de sintaxe... é algum erro de conceito que eu não estou sabendo resolver! Valeu cara!
  20. Pessoal, boa tarde! Gostaria de uma ajuda. Preciso montar uma função VB genérica para executar Stored Procedures (SPs) e retornar um valor destas. No caso, essas SPs irão retornar a ID do registro que acabou de ser incluído. Como o projeto usa Selects com o comando "WITH (NOLOCK)", está ocorrendo a perda da ID correta caso seja usado o comando Select Max(). O sistema está em uso por uma empresa e vários usuários realizam cadastros quase simultaneamente. Normalmente, ao inserir uma informação, é dado um Select Max para atribuir a ID do registro recém inserido à uma variável no VB. Porém, devido ao explicado acima, está ocorrendo a troca de IDs. Ai veio a idéia de testar o retorno de informação das SPs com SCOPE IDENTITY, para ter maior segurança com os dados inseridos e ter a confiança que trará a ID correta. Porém, cada SP tem uma quantidade de parâmetros que são passados. Então teria que montar uma função genérica para, de acordo com a SP, inserir os parâmetros. É a primeira vez que uso o ADODB.Parameters e estou meio perdido. Segue abaixo o código: Public Function gfcnExecutarIDAtual(ByVal lstrProcedure As String, _ ByRef lstrParametros() As String) As Variant Dim llngContador As Long 'Usado para o laço dos parâmetros Dim lstrSQL As String 'Usado para retornar os nomes dos parâmetros da SP Dim lcmmExecute As New ADODB.Command Dim ladoParametro As New ADODB.Parameter Dim lrsDados As ADODB.Recordset Dim ladoTipo As ADODB.DataTypeEnum Dim ladoEntradaSaida As ADODB.ParameterDirectionEnum gfcnExecutarIDAtual = 0 With lcmmExecute .ActiveConnection = gconConexao .CommandType = adCmdText If UBound(lstrParametros) >= 0 Then '# Retorna o nome das colunas/parâmetros da SP lstrSQL = "sp_sproc_columns " & lstrProcedure Set lrsDados = New ADODB.Recordset lrsDados.CursorType = adOpenForwardOnly lrsDados.CursorLocation = adUseClient lrsDados.LockType = adLockReadOnly lrsDados.Open lstrSQL, gconConexao, , , adCmdText '# O primeiro parâmetro sempre é RETURN_VALUE. Não iremos trabalhar com ele. If lrsDados(eParametrosSP.eNomeParametro).Value = "@RETURN_VALUE" Then lrsDados.MoveNext .CommandType = CommandTypeEnum.adCmdStoredProc '# É adicionado mais um ao índice máximo do vetor para que seja incluído '# o parâmetro que retorna a IDAtual (@O_IDATUAL) For llngContador = 0 To (UBound(lstrParametros) + 1) '# Verifica o tipo do parâmetro - Coluna 6 Select Case UCase(CStr(lrsDados.Fields.Item(eParametrosSP.eTipoParametro))) Case "INT" ladoTipo = ADODB.DataTypeEnum.adInteger Case "NUMERIC" ladoTipo = ADODB.DataTypeEnum.adNumeric Case "VARCHAR" ladoTipo = ADODB.DataTypeEnum.adVarChar End Select '# Verifica se é um parâmetro de Entrada ou Saída If Mid(CStr(lrsDados(eParametrosSP.eNomeParametro).Value), 1, 2) = "@I" Then ladoEntradaSaida = ADODB.ParameterDirectionEnum.adParamInput Else ladoEntradaSaida = ADODB.ParameterDirectionEnum.adParamOutput End If '# O parâmetro de saída (retorno) não passa valores If llngContador <= UBound(lstrParametros) Then .Parameters.Append .CreateParameter(lrsDados(eParametrosSP.eNomeParametro).Value, ladoTipo, ladoEntradaSaida, , lstrParametros(llngContador)) Else .Parameters.Append .CreateParameter(lrsDados(eParametrosSP.eNomeParametro).Value, ladoTipo, ladoEntradaSaida) End If lrsDados.MoveNext Next End If .CommandText = lstrProcedure .Execute gfcnExecutarIDAtual = .Execute("@O_IDATUAL") End With Set lrsDados = Nothing Set lcmmExecute = Nothing End Function Como pode ser visto, os parâmetros são portanto criados dinamicamente. Neste laço que estou testando, com 3 parâmetros, a primeira execução ocorre corretamente (passando pelo primeiro Parameter.Append). Logo após isso, ao tentar passar novamente pelo primeiro Append, ocorre um erro. Como os valores mudaram e não entendo muito desse objeto, não entendi o motivo do erro. Em vários lugares que pesquisei não achei nada anormal com o código. O erro é o seguinte: "Objeto Parameter definido incorretamente. As informações são inconsistentes ou incompletas." Poderiam me ajudar?
  21. Sim sim! Foi o que fiz, removi a rotina do Activate. Depois houve a necessidade de usar no Activate e já criei a flag, para evitar o problema ;) Obrigado!
  22. kuroi, não sei bem explicar o que houve... coloquei um Watch para verificar as mudanças no MaxRows da grid. De alguma forma, é chamada o Form_Activate do form que perdia a linha. Neste Activate, é feito um select para retornar os dados já cadastrados. Tento em vista que a linha vinda dos forms de consulta ainda não foram gravadas em banco (estão apenas sendo visualizadas pelo usuário) ela some. Deve ser o problema de foco que tu falou mesmo. Mas não entendi o porque de entrar no Activate quando deu um Unload no form de consulta. Obrigado pela paciência e colaboração! Abraço!
  23. kuroi, percebi onde está ocorrendo a divergência. Os dados da tela de consulta por multi-seleção são armazenados em matrizes. Após armazenar os valores, a tela chama o Unload do Form. '# Pega todos os id's das linhas checadas For mlngLinha = 1 To lvwME.ListItems.Count '# Armazena o Id do item selecionado If lvwME.ListItems(mlngLinha).Checked = True Then ReDim Preserve mlngIdSelecionados(mlngIndiceMatriz) ReDim Preserve mstrSelecionados(mlngIndiceMatriz) mlngIdSelecionados(mlngIndiceMatriz) = lvwME.ListItems(mlngLinha).SubItems(1) mstrSelecionados(mlngIndiceMatriz) = lvwME.ListItems(mlngLinha).Text mlngIndiceMatriz = mlngIndiceMatriz + 1 mcolIDs.Add lvwME.ListItems(mlngLinha).SubItems(1) '# Se tem alguma item selecionado lblnPassou = True mintContador = mintContador + 1 End If Next mlngLinha lblnAvancar = True Unload Me End If Exit Sub Neste unload é chamada uma função global que remove o form de consulta da coleção de forms do projeto. Form_Unload If lblnAvancar = True Then Call gsubFecharFormulario(Me) Unload Me Exit Sub End If Procedure de FecharFormulário Public Sub gsubFecharFormulario(ByVal lfrmForm As Form) On Error GoTo erro Dim llngContador As Long For llngContador = 1 To gcolFormularioGlobal.Count If lfrmForm.Name = gcolFormularioGlobal(llngContador) Then gcolFormularioGlobal.Remove (llngContador) If gcolFormularioGlobal(llngContador) = False Then If gcolFormularioGlobal.Count <= 0 Then MDIGsoft.Show vbModal End If gcolFormularioGlobal.Remove (llngContador) Exit Sub End If Next llngContador Exit Sub Bom, entre o Unload Me do primeiro trecho de código e o End if logo abaixo ocorre a perda dessa linha. Pelo que reparei, a perda da linha no outro formulário acontece nesse form de consulta :blink: Coloquei um break no lblnAvancar = True. Até aí corre tudo bem. Coloquei um break no Unload Me, ele já remove a linha no form que receberá os valores. Agora, se fizer tudo isso debugando, não haverá problemas :/ Respondendo uma de suas perguntas: a grid não vai receber valores diretamente do banco. A tela de consulta realiza toda a pesquisa e apenas passa o valor final pra esse form que está perdendo a linha. No mínimo, intrigante :blink: Lembrando que esse processo é realizado igualmente por outro form e não apresenta problemas.
  24. Fiz outro teste agora: forcei (via debug) a inserção de uma linha (parâmetro) e seu respectivo valor (via consulta). Após isso, tentei alterar o valor deste mesmo parâmetro (ou seja, linha já existente). Não funcionou. O valor anterior do parâmetro permanece, como se nada tivesse ocorrido. Não achei nada parecido no Google. De fato não sei nem mais como devo pesquisar hehe ;)
  25. Não parou em nenhum breakpoint. Existe a possibilidade de haver alguma perda de parâmetro, não sei bem, mas entre o fechamento de um form e foco no outro? Nunca trabalhei com Collection e, para a Consulta normal é usada uma Collection. O estranho é que ela não influenciaria de forma alguma na perda da linha... ;s Que estranho viu cara. Ainda mais pelo fato de funcionar debugando :/
×
×
  • Criar Novo...