none
Acumular soma dentro de um loop RRS feed

  • Pergunta

  • Ba Galera, bom dia.

    Estou usando a logica abaixo tche que o grande amigo do fórum Fabio Jr me passou. E estou colocando, mas dois arquivos para ele ler, e realizar a contagem de repetição dos valores tche, porem nesta nova alteração eu necessito que a resposta do script seja o valor acumulado dos 3 arquivos tche.

    Da forma que esta tche, ele esta fazendo o calculo de repetição e somando os valores e apresentando no resultado o nome do grupo, mas o valor da conta, porem ele aparece o msgbox para cada usuário do grupo x, e eu gostaria tche que ele mostrasse uma vez só o grupo e o valor final da soma das repetições de todos os usuários do grupo x e depois do y e assim vai tche.

    Como posso fazer para que ele acumule o valor da variável strcalcfinal para que ele de a soma final.

    Já coloquei desta forma strcalcfinal =  strcalcfinal  & contaUsuario + contaUsuario1 + contaUsuario2, mas ele repete o mesmo grupo porem o valor final fica a primeira coleta e acumula do lado os demais valores, e já mudei o & por + ai ele soma a primeira leitura com as demais e não seria isso que eu gostaria tche.

    Resumidamente, tenho 20 usuários que aparece em 3 arquivos diferentes, o script conta quantas vezes cada usuário aparece em cada arquivo, e no final soma, alguns usuários são do grupo A, outros do B outros do C e outros do D, e o resultado que espero tche é grupo A  =  50, sendo que o valor 50 é a soma final de todos os valores repetidos os usuários do grupo A nos 3 arquivos.

    Referencia dos arquivos caso necessario tche esta no: https://social.technet.microsoft.com/Forums/pt-BR/8214e808-5282-4b98-87f1-374191706a19/melhorar-gravao-do-arquivo-de-log?forum=scriptadminpt

    Obrigado galera.

    Código

    Set oFSO = CreateObject("Scripting.FileSystemObject")
    	sFile = "c:\Temp\Analistas.csv"
    	strlog = "c:\Temp\saida.txt"
    	strleitura = "C:\Temp\Abertos.csv"
    	strremoto = "c:\Temp\IDs.txt"
    	strremoto = "c:\Temp\fechados.txt"
    	strparametros = "c:\Temp\parametros.txt"
    	
    If oFSO.FileExists(strparametros) Then
    	Set oFile = oFSO.OpenTextFile(strparametros, 1)
    	
    	'Loop Principal
    	Do While Not oFile.AtEndOfStream
    		arrLinha = split(oFile.ReadLine,";")
    		strCodigo      = arrLinha(0)
    		strUsuario     = arrLinha(1)
    		strNomeUsuario = arrLinha(2)
    		strgrupo       = arrLinha(3)
    
    		Set oFile_1 = oFSO.OpenTextFile(strleitura, 1)
    		contaUsuario = 0
    		Do While Not oFile_1.AtEndOfStream
    			if InStr(oFile_1.ReadLine, strcodigo) then 
    				contaUsuario = contaUsuario + 1
    			end if
    		loop
    		oFile_1.close
    		Set oFile_1 = Nothing
    
    		Set oFile_2 = oFSO.OpenTextFile(strremoto, 1)
    		contaUsuario1 = 0
    		Do While Not oFile_2.AtEndOfStream
    			if InStr(oFile_2.ReadLine, strcodigo) then 
    				contaUsuario1 = contaUsuario1 + 1
    			end if
    		loop
    		oFile_2.close
    		Set oFile_2 = Nothing
    		
    		Set oFile_3 = oFSO.OpenTextFile(strremoto1, 1)
    		contaUsuario2 = 0
    		Do While Not oFile_3.AtEndOfStream
    			if InStr(oFile_3.ReadLine, strcodigo) then 
    				contaUsuario2 = contaUsuario2 + 1
    			end if
    		loop
    		oFile_3.close
    		Set oFile_3 = Nothing			
    		
    		'Loop pra localizar info dentro do arquivo 2
    		Set oFile_4 = oFSO.OpenTextFile(sFile, 1)
    		Do While Not oFile_4.AtEndOfStream
    			Linha_Arquivo2 = oFile_4.ReadLine
    			if InStr(Linha_Arquivo2, strusuario) then 
    				arrLinha = split(Linha_Arquivo2,";")
    				strura01 = arrura(0)
    				strura02 = arrura(5)
    				strura03 = arrura(10)
    				
    				exit do
    			end if
    		loop
    		oFile_4.close
    		Set oFile_4 = Nothing
    
    		strcalcfinal = contaUsuario + contaUsuario1 + contaUsuario2
    
    		msgbox strGrupo & " | " & strcalcfinal
    	Loop
    End If


    sexta-feira, 28 de novembro de 2014 12:52

Respostas

  • O script (eu comentei um trecho no final porque estava dando erro, talvez eu tenha sem querer mexido em algo).

    Usei o dicionário para acumular valores.

    Set oFSO = CreateObject("Scripting.FileSystemObject")
    	sFile = "c:\Temp\Analistas.csv"
    	strlog = "c:\Temp\saida.txt"
    	strleitura = "C:\Temp\Abertos.csv"
    	strremoto1 = "c:\Temp\IDs.txt"
    	strremoto = "c:\Temp\fechados.txt"
    	strparametros = "c:\Temp\parametros.txt"
    
    Set d = CreateObject("Scripting.Dictionary")	
    
    If oFSO.FileExists(strparametros) Then
    	Set oFile = oFSO.OpenTextFile(strparametros, 1)
    	
    	'Loop Principal
    	Do While Not oFile.AtEndOfStream
    		arrLinha = split(oFile.ReadLine,";")
    		strCodigo      = trim(arrLinha(0))
    		strUsuario     = trim(arrLinha(1))
    		strNomeUsuario = trim(arrLinha(2))
    		strgrupo       = trim(arrLinha(3))
    
    		wscript.echo "Lendo " & strUsuario
    
    		'Faz contagem no arquivo Leitura
    		wscript.echo "	Localizando " & strCodigo & " em " & strLeitura
    		Set oFile_1 = oFSO.OpenTextFile(strleitura, 1)
    		contaUsuario = 0
    		Do While Not oFile_1.AtEndOfStream
    			if InStr(oFile_1.ReadLine, strcodigo) then 
    				contaUsuario = contaUsuario + 1
    			end if
    		loop
    		oFile_1.close
    		Set oFile_1 = Nothing
    		wscript.echo "	Resultado " & contaUsuario
    		
    		'Faz contagem no arquivo Remoto
    		wscript.echo "	Localizando " & strCodigo & " em " & strremoto
    		Set oFile_2 = oFSO.OpenTextFile(strremoto, 1)
    		contaUsuario1 = 0
    		Do While Not oFile_2.AtEndOfStream
    			if InStr(oFile_2.ReadLine, strcodigo) then 
    				contaUsuario1 = contaUsuario1 + 1
    			end if
    		loop
    		oFile_2.close
    		Set oFile_2 = Nothing
    		wscript.echo "	Resultado " & contaUsuario1
    		
    		'Faz contagem no arquivo remoto1
    		wscript.echo "	Localizando " & strCodigo & " em " & strremoto1
    		Set oFile_3 = oFSO.OpenTextFile(strremoto1, 1)
    		contaUsuario2 = 0
    		Do While Not oFile_3.AtEndOfStream
    			if InStr(oFile_3.ReadLine, strcodigo) then 
    				contaUsuario2 = contaUsuario2 + 1
    			end if
    		loop
    		oFile_3.close
    		Set oFile_3 = Nothing
    		wscript.echo "	Resultado " & contaUsuario2
    		
    		'Loop pra localizar info dentro do arquivo 2
    		'Set oFile_4 = oFSO.OpenTextFile(sFile, 1)
    		'Do While Not oFile_4.AtEndOfStream
    	'		Linha_Arquivo2 = oFile_4.ReadLine
    '			if InStr(Linha_Arquivo2, strusuario) then 
    '				arrLinha = split(Linha_Arquivo2,";")
    '				strura01 = arrura(0)
    '				strura02 = arrura(5)
    '				strura03 = arrura(10)
    '				
    '				exit do
    '			end if
    '		loop
    '		oFile_4.close
    '		Set oFile_4 = Nothing
    
    		strcalcfinal = contaUsuario + contaUsuario1 + contaUsuario2
    		wscript.echo "	TOTAL= " & strcalcfinal
    		
    		if d.Exists(strGrupo) then
    			'Adiciona mais a chave existente
    			wscript.echo "		adicionando " & strGrupo
    			d(strGrupo)=d(strGrupo) + strcalcfinal
    		else
    			'Cria nova chave
    			wscript.echo "		criando " & strGrupo
    			d.add strGrupo,strcalcfinal
    		end if
    		
    		
    		'msgbox strGrupo & " | " & strcalcfinal
    	Loop
    End If
    
    'Ao final vamos ler o conteudo do dicionario
    a = d.Items   ' Get the items.
    k = d.Keys
    For i = 0 To d.Count -1 ' Iterate the array.
          wscript.echo k(i) & vbtab & a(i) 
    Next
    

    Confere aí, veja se funcionou, qualquer coisa retorne.

    Vamos nos ater primeiro ao resultado, depois partimos pra entender o dicionário.

    Ref.:

    Dictionary Object

    http://msdn.microsoft.com/en-us/library/x4k5wbx4%28v=vs.84%29.aspx


    Fábio de Paula Junior

    • Marcado como Resposta Marcelo TI quarta-feira, 10 de dezembro de 2014 19:45
    quarta-feira, 10 de dezembro de 2014 19:17
    Moderador
  • A primeira vez que usei esse dicionário foi quando eu fiz um script para descobrir qual a última vez que um usuário tinha se logado no dominio.

    Quando o usuário loga no dominio ele registra o logon em apenas um Domain Controller, então o que eu fiz:

    1) criei um dicionário e use como chave o login do usuário

    2) Lia os valores do primeiro DC é criava o elemento do dicionário com chave=Login e Valor=data de logon.

    3) Quando eu ia pro segundo DC eu comparava a data de logon do usuário do DC com a data do usuário no dicionário, se fosse maior eu alterava o dicionário, ao final eu tinha um dicionário assim:

    Key	Valor
    fabio   01/01/2010 20:00:00
    marcelo 02/01/2011 18:00:00

    Dá pra brincar bastante com o dicionário, veja este exemplo onde eu guardo cidade e estado dentro do valor (usando array pra isso)

    Set d = CreateObject("Scripting.Dictionary")
    d.Add "1", array("Vitória","ES")
    d.Add "2", array("Guaçuí","ES")
    d.Add "3", array("Belo Horizonte","MG")
    
    a = d.Items   ' Get the items.
    For i = 0 To d.Count -1 
    	
    	wscript.echo "Cidade " & a(i)(0) & vbtab & "Estado " & a(i)(1)
    Next


    Fábio de Paula Junior


    • Editado Fábio JrModerator quinta-feira, 11 de dezembro de 2014 00:19
    • Marcado como Resposta Marcelo TI quinta-feira, 11 de dezembro de 2014 13:46
    quinta-feira, 11 de dezembro de 2014 00:15
    Moderador

Todas as Respostas

  • Ba galera bom dia

    Alguém poderia me ajudar tche, alguém sabe como acumular os valores coletados pelas variáveis,

    contaUsuario

    contaUsuario1

    contaUsuario2

    Para que seja apresentado no final tche a soma dos valores acumulados no strcalcflinal ?

    obrigado galera.

    segunda-feira, 1 de dezembro de 2014 11:32
  • Já tentou isso?

    strcalcfinal = strcalcfinal + contaUsuario + contaUsuario1 + contaUsuario2

    Mas para imprimir o valor total tem que ser fora do Loop principal


    Fábio de Paula Junior

    segunda-feira, 1 de dezembro de 2014 16:41
    Moderador
  • Ba Fabião.

    Sim ja tentei tche, dentro do loop o valor fica acumulando a cada repetição de grupo, por exemplo o primeiro valor é 9, e o segundo é 20 e o terceiro é 40 quando ele imprime fica 92040, ele não soma o valor final, e quando coloco fora do loop, ele imprime somente a ultima linha levantada no loop tche.

    segunda-feira, 1 de dezembro de 2014 17:19
  • A soma está na posição correta.

    O erro é que ele está considerando como se fosse um texto ao invés de número.

    Procure sobre converter texto para número.


    Fábio de Paula Junior

    segunda-feira, 1 de dezembro de 2014 17:56
    Moderador
  • Fabião

    As variáveis

    contaUsuario

    contaUsuario1

    contaUsuario2

    são numeros tche, quanto que ele da o valor correspondente ao grupo tche, a questão é que tenho 6 valores que foram levantados pelas variáveis, e pelo que estou compreendo teria que formar algo para acumular estes valores e somar estes valores para que seja feita a soma final.

    da forma que esta quando rodo tche ele me retorna grupoA | 5, grupo A | 6, grupo | 8 e assim vai ate o sexto codigo contado, então teria que ter algum forma de acumular estes 6 valores de cada variável, somar para que no final ele some o resultado de cada uma e de um resultado final.

    segunda-feira, 1 de dezembro de 2014 18:27
  • Vê se dá diferença

    strcalcfinal = strcalcfinal + CINT(contaUsuario) + CINT(contaUsuario1) + CINT(contaUsuario2)

    Veja, apesar de ser um número não quer dizer que o programa está entendendo como um número, "9" é diferente de 9.


    Fábio de Paula Junior

    segunda-feira, 1 de dezembro de 2014 19:28
    Moderador
  • Ba Fabião compreendi a diferença tche.

    Fiz o teste e desta forma ele esta apresentando ainda as 6 vezes o grupoA ao invés de uma vez só com o valor final, e desta forma tche ele esta somando os valores, por exemplo, na situação sem esta sugestão ele vem, 9, 1, 16, 14, 12, 8 que da 60, usado esta sugestão ele faz da seguinte forma 9, 10, 26, 40, 52, 60,  porem quando ele pula pra o próximo grupo, ele soma o 60 com o primeiro valor do grupoB e fica 69, que seria a soma do 60 do grupoA com o 9 do grupoB tche.

    Se possível quando eu for mandar para o log eu necessitaria que a escrita fosse somente do valor total do grupo A que seria o 60, e o total do grupoB e assim por diante tche, será que é possível fazer algo assim Fabião ?

    Obrigado pela ajuda e paciência.

    terça-feira, 2 de dezembro de 2014 11:58
  • Eu não estou entendendo o que você quer.

    Se você quer somente o valor total por grupo então você deve se perguntar: Quando começa a leitura do próximo grupo? Resposta: Quando recomeça o loop principal, então você deve zerar o valor total no inicio do loop principal e dar saída para o arquivo no final do loop principal.


    Fábio de Paula Junior

    terça-feira, 2 de dezembro de 2014 16:17
    Moderador
  • Ba fabião to dando um nó na cabeça em kkk, deixa eu ver se eu consigo ser mas simples.

    Eu leio um arquivo de parâmetro, que me da o código do usuário e tb me da o nome do grupo que ele faz certo.

    O script le 3 arquivo e busca o código do usuário para saber quantas vezes este código aparece no arquivo A, como ele esta fazendo um grande loop, a cada loop ele da o resultado de cada usuário, ate aqui tudo bem esta tudo certo.

    Tenho 4 grupos, e pelo arquivo de paramento eu sei a qual grupo cada usuário faz parte que tb esta ok

    O que quero fazer, gerar uma nova saída para toda esta coleta de informação, juntando o valor total de cada usuário em 3 variável final para realizar uma soma final, e assim apresentar um único resultado de cada grupo por exemplo, grupo A tem o valor 90, que representa todos os usuários do grupo A que foi coletado na leitura dos 3 arquivos.

    E meio complexo mesmo tche acho que não deve ter uma forma de fazer utilizado esta lógica usada neste script talvez por uma outra lógica.

    terça-feira, 2 de dezembro de 2014 17:53
  • Guarde os valores em um arquivo (ou dentro de um objeto dicionário, mas recomendo vc usar arquivo porque seu que você tem mais familiaridade) ao final de cada interação do loop.

    Depois quando acabar as leituras e sair do loop leia o arquivo com o resultado.

    Se não for isso então me dê um exemplo do resultado de apenas dois grupos, como eles estão e o que você quer exibir ao final do script.


    Fábio de Paula Junior

    quarta-feira, 3 de dezembro de 2014 19:54
    Moderador
  • Ba Fabião bom dia.

    Cara muito obrigado mesmo pela sua ajuda tche, realmente nem sei como agradecer pelas as ajudas e pelas oportunidade de aprendizado que tenho com suas repostas, pois além de ajudar vc explica o que é e como fazer as coisas tche e não é qualquer pessoa que tem este dom e a paciência de compartilhar conhecimento e ensinar os que não sabem isso não é pra qualquer pessoa.

    Gostaria muito de aprender, mas um processo caso vc tenha tempo e possa ajudar, gostaria de tentar este processo do objeto dicionário tche.

    Sobre os arquivos, tenho 4 arquivos, o primeiro que chamo de parâmetros que tem esta estrutura;

    Conta ; Nome ; Grupo, que ficaria assim ( Msilva  ; Marcelo Silva  ; _TI01 ), neste arquivo tenho todas as contas e 16 grupos, que vai do _TI01 ao _TI16, e neste arquivo tenho 60 contas mais ou menos, sendo que em media eu tenho por grupo 4 ou 5 contas por grupo.

    Os outros 3 arquivos têm estruturas diferentes porem em todos eles a única coisa que tenho igual ao arquivo de parâmetros é a Conta, por este motivo foi criado à rotina para ler todas as linhas de cada arquivo e contar quantas vezes a Conta aparece.

    O que eu espero no resultado final tche é o valor final acumulado de cada grupo, por exemplo, quando for lido os 3 arquivos o Msilva vai ter o valor 5 em um 10 em outro e 20 no terceiro, e o Msilva é do grupo _TI01, porem o Tsilva também é do grupo _TI01 e ele vai ter 3 valores, como a Alopes, e o Gaugusto, no final eu gostaria que os 12 valores coletados fosse apresentados em um valor único dizendo que o Grupo _TI01 aparece 90 vezes na leitura a mesma coisa para o Grupo _TI02, _TI03 e assim por diante tche.

    Será que conseguir deixar de uma forma clara meu amigo.


    • Editado Marcelo TI sexta-feira, 5 de dezembro de 2014 01:33
    quinta-feira, 4 de dezembro de 2014 20:04
  • Marcelo,

    Ao final da primeira volta do loop principal o que você tem pronto?


    Fábio de Paula Junior

    sexta-feira, 5 de dezembro de 2014 12:13
    Moderador
  • Ba Fabião.

    Na primeira execução do loop eu tenho este resultado _TI01 ; 35, que é a soma da leitura dos 3 arquivos e correspondem a soma de quantas vezes o MSilva aparece nos 3 arquivos.

    Quando ele executa de novo o loop ai vem _TI01 ; 28, que é a soma da leitura dos 3 arquivos e correspondem a soma de quantas vezes o Tsilva aparece nos 3 arquivos, assim por diante.

    Obrigado Fabião.


    • Editado Marcelo TI sábado, 6 de dezembro de 2014 15:12
    sábado, 6 de dezembro de 2014 14:56
  • Ba Fabião.

    Necessita de mas alguma informação tche.

    obrigado mas uma vez.

    terça-feira, 9 de dezembro de 2014 14:08
  • Sim, preciso.

    Como você quer exibir isso pra quem vai executar o script?

    Use como exemplo estas duas voltas do loop que você usou.


    Fábio de Paula Junior

    terça-feira, 9 de dezembro de 2014 15:18
    Moderador
  • Ba Fabião,

    Eu vou gravar em arquivo a informação porem neste momento pode ser em msgbox o resultado.

    Usando o que foi dito acima tche, o resultado que espero é uma uníca exibição do _TI01, com o resultado final que seria 63, ou seja seria exibido no msgbox  _TI01 ; 63, que de outra forma seria a soma dos 6 valores coletados sendo 3 do Msilva e 3 do Tsilva, que fazem parte do grupo _TI01.

    Obrigado Fabião.

    terça-feira, 9 de dezembro de 2014 15:47
  • Manda um exemplo de cada um desses arquivos pra eu poder executar e testar.

    Set oFSO = CreateObject("Scripting.FileSystemObject")
    	sFile = "c:\Temp\Analistas.csv"
    	strlog = "c:\Temp\saida.txt"
    	strleitura = "C:\Temp\Abertos.csv"
    	strremoto = "c:\Temp\IDs.txt"
    	strremoto = "c:\Temp\fechados.txt"
    	strparametros = "c:\Temp\parametros.txt"

    Olha que strremoto tem dois, só está valendo o fechados.txt


    Fábio de Paula Junior

    quarta-feira, 10 de dezembro de 2014 12:57
    Moderador
  • Ba Fabião

    Errei na escrita tche o strremoto referente ao arquivo IDs.txt tem que ser lido tb, este pode ser chamado de strremoto1 , tche.

    O sfile Fabião não entra no calculo da soma dos agrupados tche, ele esta ai pq na hora que eu for fazer a escrita no texto eu vou escrever o valor real que esta no arquivo sem conta, os unicos que devem ser agrupados e somados são os resultados do strremoto, strremoto1 e strleitura.

    Obrigado.

    Segue tche.

    strParametros.

    Msilva  ; Marcelo Silva  ; _TI01
    Tsilva  ; Tiago Silva  ; _TI01
    Alopes  ; Ana Lopes  ; _TI01
    Gaugusto  ; Gustavo Augusto  ; _TI01
    Cpinto  ; Carlos Pinto  ; _TI02
    Amaria  ; Ana Maria  ; _TI02
    Gsantos ; Gilberto Santos  ; _TI02
    Wleite  ; Wellington Leite  ; _TI03
    Ffaria  ; Felipe Faria  ; _TI03

    strremoto

    ID2362373-001;ESTACAO;17/10/2014 17:39;24/10/2014 17:13;TECNICO REMOTO;Msilva;;;;;;
    ID2362419-001;ESTACAO;17/10/2014 18:07;24/10/2014 17:12;TECNICO REMOTO;Alopes;;;;;;
    ID2363130-001;ITENS DE PACOTE;20/10/2014 09:38;24/10/2014 15:03;TECNICO LOCAL;Ffaria;;;;;;

    strleitura

    ID2447156;24/10/2014 10:22;Fraria;ENCERRADO;CONSULTA/DUVIDA;Consulta duvida sobre bloqueio de senha;
    ID2447427;24/10/2014 12:23;Wleite;ENCERRADO;CONSULTA/DUVIDA;O usuario esta com  a senha expirada.;
    ID2447438;24/10/2014 12:34;Wleite;ENCERRADO;CONSULTA/DUVIDA;O usuario esta com a senha expirada;
    ID2447475;24/10/2014 12:57;Amaria;ENCERRADO;CONSULTA/DUVIDA;Senha da usuaria consta como bloqueada;
    ID2447562;24/10/2014 13:52;Msilva;ENCERRADO;CONSULTA/DUVIDA;Duvidas sobre liberacao de e-mail;

    strremoto1

    Msilva;ID4462383-001;ESTACAO;17/10/2014 17:39;24/10/2014 17:13;ANALISTA;;;;;;
    Alopes;ID4480410-001;ESTACAO;17/10/2014 18:07;24/10/2014 17:12;ANALISTA;;;;;;
    Ffaria;ID4467890-001;ITENS DE PACOTE;20/10/2014 09:38;24/10/2014 15:03;ANALISTA LOCAL;;;;;;

    sfile

    Carlos Pinto;03:39:59;02:38:11;01:01:48;14;25;0;0;71,91;28,09;
    Wellington Leite;06:38:43;04:57:48;01:40:55;44;44;0;0;74,69;25,31;
    Marcelo Silva;05:56:47;05:03:41;00:53:06;45;45;0;0;85,12;14,88;
    Ana Maria;05:48:56;04:51:35;00:57:21;37;37;0;0;83,56;16,44;


    • Editado Marcelo TI quarta-feira, 10 de dezembro de 2014 15:37
    quarta-feira, 10 de dezembro de 2014 15:36
  • Executei e tive um erro na linha 18

    strgrupo       = arrLinha(3)


    É a parte onde lê o strParametros, porém não existe uma quarta coluna nele.

    Msilva  ; Marcelo Silva  ; _TI01
    Tsilva  ; Tiago Silva  ; _TI01
    Alopes  ; Ana Lopes  ; _TI01
    Gaugusto  ; Gustavo Augusto  ; _TI01
    Cpinto  ; Carlos Pinto  ; _TI02
    Amaria  ; Ana Maria  ; _TI02
    Gsantos ; Gilberto Santos  ; _TI02
    Wleite  ; Wellington Leite  ; _TI03
    Ffaria  ; Felipe Faria  ; _TI03

    Ele só tem 3 colunas.

    Erro:

    C:\Users\fabio\Desktop\vbs.vbs(18, 3) Erro de tempo de execução do Micros
    oft VBScript: Subscrito fora do intervalo: '[number: 3]'


    Fábio de Paula Junior



    quarta-feira, 10 de dezembro de 2014 16:49
    Moderador
  • Ba Fabião desculpe-me realmente faltou é assim que ele tem que ser.

    Msilva  ; Marcelo Silva ; 01 ; _TI01
    Tsilva  ; Tiago Silva ; 01 ; _TI01
    Alopes  ; Ana Lopes ; 01 ; _TI01
    Gaugusto  ; Gustavo Augusto ; 01 ; _TI01
    Cpinto  ; Carlos Pinto ; 02 ; _TI02
    Amaria  ; Ana Maria ; 02 ; _TI02
    Gsantos ; Gilberto Santos ; 02 ; _TI02
    Wleite  ; Wellington Leite ; 02 ; _TI03
    Ffaria  ; Felipe Faria ; 02 ; _TI03



    • Editado Marcelo TI quarta-feira, 10 de dezembro de 2014 16:58
    quarta-feira, 10 de dezembro de 2014 16:57
  • Script que executei:

    Set oFSO = CreateObject("Scripting.FileSystemObject")
    	sFile = "c:\Temp\Analistas.csv"
    	strlog = "c:\Temp\saida.txt"
    	strleitura = "C:\Temp\Abertos.csv"
    	strremoto1 = "c:\Temp\IDs.txt"
    	strremoto = "c:\Temp\fechados.txt"
    	strparametros = "c:\Temp\parametros.txt"
    	
    If oFSO.FileExists(strparametros) Then
    	Set oFile = oFSO.OpenTextFile(strparametros, 1)
    	
    	'Loop Principal
    	Do While Not oFile.AtEndOfStream
    		arrLinha = split(oFile.ReadLine,";")
    		strCodigo      = trim(arrLinha(0))
    		strUsuario     = trim(arrLinha(1))
    		strNomeUsuario = arrLinha(2)
    		'strgrupo       = arrLinha(3)
    
    		wscript.echo "Lendo " & strUsuario
    
    		'Faz contagem no arquivo Leitura
    		wscript.echo "	Localizando " & strCodigo & " em " & strLeitura
    		Set oFile_1 = oFSO.OpenTextFile(strleitura, 1)
    		contaUsuario = 0
    		Do While Not oFile_1.AtEndOfStream
    			if InStr(oFile_1.ReadLine, strcodigo) then 
    				contaUsuario = contaUsuario + 1
    			end if
    		loop
    		oFile_1.close
    		Set oFile_1 = Nothing
    		wscript.echo "	Resultado " & contaUsuario
    		
    		'Faz contagem no arquivo Remoto
    		wscript.echo "	Localizando " & strCodigo & " em " & strremoto
    		Set oFile_2 = oFSO.OpenTextFile(strremoto, 1)
    		contaUsuario1 = 0
    		Do While Not oFile_2.AtEndOfStream
    			if InStr(oFile_2.ReadLine, strcodigo) then 
    				contaUsuario1 = contaUsuario1 + 1
    			end if
    		loop
    		oFile_2.close
    		Set oFile_2 = Nothing
    		wscript.echo "	Resultado " & contaUsuario1
    		
    		'Faz contagem no arquivo remoto1
    		wscript.echo "	Localizando " & strCodigo & " em " & strremoto1
    		Set oFile_3 = oFSO.OpenTextFile(strremoto1, 1)
    		contaUsuario2 = 0
    		Do While Not oFile_3.AtEndOfStream
    			if InStr(oFile_3.ReadLine, strcodigo) then 
    				contaUsuario2 = contaUsuario2 + 1
    			end if
    		loop
    		oFile_3.close
    		Set oFile_3 = Nothing
    		wscript.echo "	Resultado " & contaUsuario2
    		
    		'Loop pra localizar info dentro do arquivo 2
    		Set oFile_4 = oFSO.OpenTextFile(sFile, 1)
    		Do While Not oFile_4.AtEndOfStream
    			Linha_Arquivo2 = oFile_4.ReadLine
    			if InStr(Linha_Arquivo2, strusuario) then 
    				arrLinha = split(Linha_Arquivo2,";")
    				strura01 = arrura(0)
    				strura02 = arrura(5)
    				strura03 = arrura(10)
    				
    				exit do
    			end if
    		loop
    		oFile_4.close
    		Set oFile_4 = Nothing
    
    		strcalcfinal = contaUsuario + contaUsuario1 + contaUsuario2
    		wscript.echo "	TOTAL= " & strcalcfinal
    		'msgbox strGrupo & " | " & strcalcfinal
    	Loop
    End If

    Saída da execução:

    C:\Users\fabio.junior\Desktop>cscript vbs.vbs
    Microsoft (R) Windows Script Host Versão 5.8
    Copyright (C) 1996-2001 Microsoft Corporation. Todos os direitos reservados.
    
    Lendo Marcelo Silva
            Localizando Msilva em C:\Temp\Abertos.csv
            Resultado 1
            Localizando Msilva em c:\Temp\fechados.txt
            Resultado 1
            Localizando Msilva em c:\Temp\IDs.txt
            Resultado 1
            TOTAL= 3
    Lendo Tiago Silva
            Localizando Tsilva em C:\Temp\Abertos.csv
            Resultado 0
            Localizando Tsilva em c:\Temp\fechados.txt
            Resultado 0
            Localizando Tsilva em c:\Temp\IDs.txt
            Resultado 0
            TOTAL= 0
    Lendo Ana Lopes
            Localizando Alopes em C:\Temp\Abertos.csv
            Resultado 0
            Localizando Alopes em c:\Temp\fechados.txt
            Resultado 1
            Localizando Alopes em c:\Temp\IDs.txt
            Resultado 1
            TOTAL= 2
    Lendo Gustavo Augusto
            Localizando Gaugusto em C:\Temp\Abertos.csv
            Resultado 0
            Localizando Gaugusto em c:\Temp\fechados.txt
            Resultado 0
            Localizando Gaugusto em c:\Temp\IDs.txt
            Resultado 0
            TOTAL= 0
    Lendo Carlos Pinto
            Localizando Cpinto em C:\Temp\Abertos.csv
            Resultado 0
            Localizando Cpinto em c:\Temp\fechados.txt
            Resultado 0
            Localizando Cpinto em c:\Temp\IDs.txt
            Resultado 0
            TOTAL= 0
    Lendo Ana Maria
            Localizando Amaria em C:\Temp\Abertos.csv
            Resultado 1
            Localizando Amaria em c:\Temp\fechados.txt
            Resultado 0
            Localizando Amaria em c:\Temp\IDs.txt
            Resultado 0
            TOTAL= 1
    Lendo Gilberto Santos
            Localizando Gsantos em C:\Temp\Abertos.csv
            Resultado 0
            Localizando Gsantos em c:\Temp\fechados.txt
            Resultado 0
            Localizando Gsantos em c:\Temp\IDs.txt
            Resultado 0
            TOTAL= 0
    Lendo Wellington Leite
            Localizando Wleite em C:\Temp\Abertos.csv
            Resultado 2
            Localizando Wleite em c:\Temp\fechados.txt
            Resultado 0
            Localizando Wleite em c:\Temp\IDs.txt
            Resultado 0
            TOTAL= 2
    Lendo Felipe Faria
            Localizando Ffaria em C:\Temp\Abertos.csv
            Resultado 0
            Localizando Ffaria em c:\Temp\fechados.txt
            Resultado 1
            Localizando Ffaria em c:\Temp\IDs.txt
            Resultado 1
            TOTAL= 2
    
    C:\Users\fabio.junior\Desktop>

    Não alterei nada no código, apenas coloquei os ECHOS para acompanhar a execução.

    Pergunta: A partir dos resultados mostrados qual deveria ser a saída que você está esperando?

    Edição: Desculpe, alterei uma coisa sim, coloquei um trim onde lê o arquivo de parametro porque o arquivo que vc me passou tinha espaços após o nome que prejudicavam a localização.


    Fábio de Paula Junior


    quarta-feira, 10 de dezembro de 2014 17:10
    Moderador
  • Ba fabião vamos la primeiro tenho que corrigir uma coisa tche.

    O arquivo de parâmetros correto é este tche.

    01 ; Msilva  ; Marcelo Silva ; _TI01
    01 ; Tsilva  ; Tiago Silva ; _TI01
    01 ; Alopes  ; Ana Lopes ; _TI01
    01 ; Gaugusto  ; Gustavo Augusto ; _TI01
    02 ; Cpinto  ; Carlos Pinto ; _TI02
    02 ; Amaria  ; Ana Maria ; _TI02
    02 ; Gsantos ; Gilberto Santos ; _TI02
    03 ; Wleite  ; Wellington Leite ; _TI03
    03 ; Ffaria  ; Felipe Faria ; 02 ; _TI03

    Com esta correção do arquivo de parâmetro vc pode liberar a leitura do strgrupo.

    Sobre a sua leitura, o resultado que espero é _TI01 = 5, ou seja é o resultado da soma do Msilva, Tsilva, Alopes e Gaugusto, e _TI02 = 1 que é o resultado da soma de Cpinto, Amaria e Gsantos, e _TI03 = 4 que é o resultado da soma de Wleite e Ffaria.

    Obrigado.

    quarta-feira, 10 de dezembro de 2014 17:21
  • O script (eu comentei um trecho no final porque estava dando erro, talvez eu tenha sem querer mexido em algo).

    Usei o dicionário para acumular valores.

    Set oFSO = CreateObject("Scripting.FileSystemObject")
    	sFile = "c:\Temp\Analistas.csv"
    	strlog = "c:\Temp\saida.txt"
    	strleitura = "C:\Temp\Abertos.csv"
    	strremoto1 = "c:\Temp\IDs.txt"
    	strremoto = "c:\Temp\fechados.txt"
    	strparametros = "c:\Temp\parametros.txt"
    
    Set d = CreateObject("Scripting.Dictionary")	
    
    If oFSO.FileExists(strparametros) Then
    	Set oFile = oFSO.OpenTextFile(strparametros, 1)
    	
    	'Loop Principal
    	Do While Not oFile.AtEndOfStream
    		arrLinha = split(oFile.ReadLine,";")
    		strCodigo      = trim(arrLinha(0))
    		strUsuario     = trim(arrLinha(1))
    		strNomeUsuario = trim(arrLinha(2))
    		strgrupo       = trim(arrLinha(3))
    
    		wscript.echo "Lendo " & strUsuario
    
    		'Faz contagem no arquivo Leitura
    		wscript.echo "	Localizando " & strCodigo & " em " & strLeitura
    		Set oFile_1 = oFSO.OpenTextFile(strleitura, 1)
    		contaUsuario = 0
    		Do While Not oFile_1.AtEndOfStream
    			if InStr(oFile_1.ReadLine, strcodigo) then 
    				contaUsuario = contaUsuario + 1
    			end if
    		loop
    		oFile_1.close
    		Set oFile_1 = Nothing
    		wscript.echo "	Resultado " & contaUsuario
    		
    		'Faz contagem no arquivo Remoto
    		wscript.echo "	Localizando " & strCodigo & " em " & strremoto
    		Set oFile_2 = oFSO.OpenTextFile(strremoto, 1)
    		contaUsuario1 = 0
    		Do While Not oFile_2.AtEndOfStream
    			if InStr(oFile_2.ReadLine, strcodigo) then 
    				contaUsuario1 = contaUsuario1 + 1
    			end if
    		loop
    		oFile_2.close
    		Set oFile_2 = Nothing
    		wscript.echo "	Resultado " & contaUsuario1
    		
    		'Faz contagem no arquivo remoto1
    		wscript.echo "	Localizando " & strCodigo & " em " & strremoto1
    		Set oFile_3 = oFSO.OpenTextFile(strremoto1, 1)
    		contaUsuario2 = 0
    		Do While Not oFile_3.AtEndOfStream
    			if InStr(oFile_3.ReadLine, strcodigo) then 
    				contaUsuario2 = contaUsuario2 + 1
    			end if
    		loop
    		oFile_3.close
    		Set oFile_3 = Nothing
    		wscript.echo "	Resultado " & contaUsuario2
    		
    		'Loop pra localizar info dentro do arquivo 2
    		'Set oFile_4 = oFSO.OpenTextFile(sFile, 1)
    		'Do While Not oFile_4.AtEndOfStream
    	'		Linha_Arquivo2 = oFile_4.ReadLine
    '			if InStr(Linha_Arquivo2, strusuario) then 
    '				arrLinha = split(Linha_Arquivo2,";")
    '				strura01 = arrura(0)
    '				strura02 = arrura(5)
    '				strura03 = arrura(10)
    '				
    '				exit do
    '			end if
    '		loop
    '		oFile_4.close
    '		Set oFile_4 = Nothing
    
    		strcalcfinal = contaUsuario + contaUsuario1 + contaUsuario2
    		wscript.echo "	TOTAL= " & strcalcfinal
    		
    		if d.Exists(strGrupo) then
    			'Adiciona mais a chave existente
    			wscript.echo "		adicionando " & strGrupo
    			d(strGrupo)=d(strGrupo) + strcalcfinal
    		else
    			'Cria nova chave
    			wscript.echo "		criando " & strGrupo
    			d.add strGrupo,strcalcfinal
    		end if
    		
    		
    		'msgbox strGrupo & " | " & strcalcfinal
    	Loop
    End If
    
    'Ao final vamos ler o conteudo do dicionario
    a = d.Items   ' Get the items.
    k = d.Keys
    For i = 0 To d.Count -1 ' Iterate the array.
          wscript.echo k(i) & vbtab & a(i) 
    Next
    

    Confere aí, veja se funcionou, qualquer coisa retorne.

    Vamos nos ater primeiro ao resultado, depois partimos pra entender o dicionário.

    Ref.:

    Dictionary Object

    http://msdn.microsoft.com/en-us/library/x4k5wbx4%28v=vs.84%29.aspx


    Fábio de Paula Junior

    • Marcado como Resposta Marcelo TI quarta-feira, 10 de dezembro de 2014 19:45
    quarta-feira, 10 de dezembro de 2014 19:17
    Moderador
  • Ba Fabião é isso mesmo tche muito obrigado mas uma vez.

    Você consegue me dar uma aula de forma que eu consiga compreender tche este dicionario, olhei o site mas parece grego tche.

    Cara sem palavras muito obrigado.

    quarta-feira, 10 de dezembro de 2014 19:38
  • O dicionário armazena um conjunto de chave + valor, a chave tem que ser única dentro do dicionário.

    Veja o exemplo do site:

    Set d = CreateObject("Scripting.Dictionary")
    d.Add "a", "Athens"   ' Add some keys and items.
    d.Add "b", "Belgrade"
    d.Add "c", "Cairo"

    Neste exemplo eu criei três elementos, o método Add tem dois parametros (chave e valor).

    Eu poderia usar este código também:

    Set d = CreateObject("Scripting.Dictionary")
    d.Add "a", "Athens"   ' Add some keys and items.
    d.Add "b", "Belgrade"
    d.Add "c", "Athens"

    Veja que tenho dois elementos com o mesmo valor (Athens)

    Agora se eu tentar isso aqui vai dar erro:

    Set d = CreateObject("Scripting.Dictionary")
    d.Add "a", "Athens"   ' Add some keys and items.
    d.Add "b", "Belgrade"
    d.Add "a", "Cairo"

    Eu não posso ter duas chaves iguais.

    No seu caso eu usei o nome do grupo como chave (_T01, _T02) e vou alterando o total de acordo com a contagem.

    Entendido isso seguimos em diante.


    Fábio de Paula Junior

    quarta-feira, 10 de dezembro de 2014 19:49
    Moderador
  • Dos arquivos que você mando acabei gerando um dicionário com esses valores:

    Key	Valor
    _TI01   44
    _TI02   0
    _TI03   2
    02      2

    Veja que apareceu um grupo estranho(02) porque o arquivo que vc mandou estava com problema na última linha.


    Fábio de Paula Junior

    quarta-feira, 10 de dezembro de 2014 19:59
    Moderador
  • Ba Show Fabião acho que compreendi tche kkk.

    compreendi o processo de criar o grupo e acumular o valor do grupo criado pelo processo do if tche, porem não consegui compreender tche como o valor chegou aqui.

    a = d.Items   ' Get the items.
    k = d.Keys

    quarta-feira, 10 de dezembro de 2014 23:41
  • Isso que vc perguntou agora é a última parte, vamos por partes.

    Vamos analisar esta parte:

    if d.Exists(strGrupo) then
    	'Adiciona mais a chave existente
    	wscript.echo "		adicionando " & strGrupo
    	d(strGrupo)=d(strGrupo) + strcalcfinal
    else
    	'Cria nova chave
    	wscript.echo "		criando " & strGrupo
    	d.add strGrupo,strcalcfinal
    end if


    Primerio, como saber se uma chave já existe? Use o dictionary.Exist(valor da chave).

    Então se eu quero saber se a chave do grupo _T01 existe basta usar

    d.Exists("_T01")

    Usei no IF, ele vai retornar verdadeiro ou falso dependendo se existe a chave ou não.

    Como eu estava em um loop eu substitui o valor da chave pela váriavel strGrupo que contém o valor da chave diferente a cada volta do loop.

    Se existe a chave eu não posso usar ADD (que já sabemos como usar), e se existe? como modificar?

    Basta usar a váriavel dicionário(valor da chave).

    Se não me engano pelo arquivo que vc passou o primeiro valor para _T01 é 11, então na primeira volta do loop será criada o conjunto com chave _T01 e valor 11.

    Já na segunda vez que passar pela chave _T01 ele vai somar ao valor já existenete para a chave _T01

    d(strGrupo)=d(strGrupo) + strcalcfinal

    Entendido isso passamos pra última parte.


    Fábio de Paula Junior

    quarta-feira, 10 de dezembro de 2014 23:54
    Moderador
  • Última parte:

    Seguindo os dados contidos nos arquivos de exemplo que vc passou eu terei ao final do loop principal os seguintes elementos dentro do dicionário

    Key	Valor
    _TI01   44
    _TI02   0
    _TI03   2
    02      2


    Quando eu usei

    a = d.Items


    Eu criei um array com o conteúdos dos valores do dicionários então:

    a(0)=44
    a(1)=0
    a(2)=2
    a(3)=2


    Quando eu usei:

    k = d.Keys

    Eu criei um array com o conteúdos das chaves do dicionários então:

    k(0)="_TI01"
    k(1)="_TI02"  
    k(2)="_TI03"   
    k(3)="02"      

    Veja que criei dois arrays diferentes mas que os dados tem relação quando eu uso o mesmo index do array, quero dizer: array 0, tenho a(0)=44 e K(0)=_TI01. O valor de _TI01 é 44.

    Por último só precisei usar o d.count pra contar quando itens tinha o dicionário (no exemplo são 4), usei menos 1 porque vai começar do 0, então o meu FOR terá valores de i de 0 até 3, suficiente pra ler os dois arrays criados e exibir os valores que você precisa.


    Fábio de Paula Junior

    quinta-feira, 11 de dezembro de 2014 00:01
    Moderador
  • A primeira vez que usei esse dicionário foi quando eu fiz um script para descobrir qual a última vez que um usuário tinha se logado no dominio.

    Quando o usuário loga no dominio ele registra o logon em apenas um Domain Controller, então o que eu fiz:

    1) criei um dicionário e use como chave o login do usuário

    2) Lia os valores do primeiro DC é criava o elemento do dicionário com chave=Login e Valor=data de logon.

    3) Quando eu ia pro segundo DC eu comparava a data de logon do usuário do DC com a data do usuário no dicionário, se fosse maior eu alterava o dicionário, ao final eu tinha um dicionário assim:

    Key	Valor
    fabio   01/01/2010 20:00:00
    marcelo 02/01/2011 18:00:00

    Dá pra brincar bastante com o dicionário, veja este exemplo onde eu guardo cidade e estado dentro do valor (usando array pra isso)

    Set d = CreateObject("Scripting.Dictionary")
    d.Add "1", array("Vitória","ES")
    d.Add "2", array("Guaçuí","ES")
    d.Add "3", array("Belo Horizonte","MG")
    
    a = d.Items   ' Get the items.
    For i = 0 To d.Count -1 
    	
    	wscript.echo "Cidade " & a(i)(0) & vbtab & "Estado " & a(i)(1)
    Next


    Fábio de Paula Junior


    • Editado Fábio JrModerator quinta-feira, 11 de dezembro de 2014 00:19
    • Marcado como Resposta Marcelo TI quinta-feira, 11 de dezembro de 2014 13:46
    quinta-feira, 11 de dezembro de 2014 00:15
    Moderador
  • Ba Fabião que aula tche, muito obrigado pela a ajuda e pelas explicações, vou reler mas algumas vezes para consolidar o conhecimento compartilhado tche.

    muito obrigado, sem palavras mesmo.

    quinta-feira, 11 de dezembro de 2014 13:48
  • Ba Fabião,

    Deixa eu fazer mas uma pergunta, caso o arquivo que eu va ler tenha esta estrutura o que eu teria que forma o que eu teria que mudar no dicionario para que ele soma-se os valores de cada grupo.

    Qualquer coisa eu abro outro post.

    _TI01 ; 27
    _TI01 ; 0
    _TI01 ; 63
    _TI01 ; 40
    _TI01 ; 42
    _TI01 ; 27
    _TI01 ; 45
    _TI01 ; 32
    _TI01 ; 39
    _TI01 ; 0
    _TI01 ; 37
    _TI01 ; 45
    _TI01 ; 0
    _TI01 ; 43
    _TI01 ; 42
    _TI01 ; 34
    _TI02 ; 15
    _TI02 ; 19
    _TI02 ; 19
    _TI02 ; 0
    _TI02 ; 36
    _TI02 ; 0
    _TI03 ; 0
    _TI03 ; 0
    _TI03 ; 27
    _TI03 ; 0
    _TI03 ; 27
    _TI03 ; 0
    _TI03 ; 42
    _TI03 ; 36
    _TI03 ; 37
    _TI03 ; 45
    _TI03 ; 8
    _TI03 ; 0

    quinta-feira, 11 de dezembro de 2014 18:24