Thread Skript zum Durchlauf (5 answers)
Opened by Philip at 2010-07-08 11:24

topeg
 2010-07-08 17:06
#139688 #139688
User since
2006-07-10
2611 Artikel
BenutzerIn

user image
Der Code macht wetgehend das was du in VBA geschrieben hast.
In perl ist manches, was in VBA einfacher geht, ein wenig umständlich, da die Strukturen etwas anders sind.
Code (perl): (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
#!/usr/bin/perl
use strict;
use warnings;
use DBI;

#server
my $host='';
# DB-Name
my $database='';
# Login Benutzer
my $user='';
# Login Passwort
my $pass='';

my $dbi=DBI->connect(
  "DBI:mysql:database=$database;host=$hostname",
  $user,
  $pass,
  {
     # script bei Fehler beenden
     RaiseError => 1,
     # Änderungen automatisch übernehmen
     # (macht das schreiben langsamer)
     AutoCommit => 1,
  },
) or die("ERROR Connect DB".$DBI::errstr."\n");

my $sth = $dbh->prepare('Select * from vicidial_agent_log_temp order by user, event_time');
$sth->execute();

# alle Zeilen als hash-Referenzen im Array @storage ablegen
my @storage;
push(@storage,$_) while($sth->fetchrow_hashref);
$sth->finish;

my ($user_alt, $time_alt, $summe_alt);
# das Array durch gehen
for(my $pos=0; $pos<@storage; $pos++)
{
  my $row=$storage[$pos];
  next if( ... );

  my $summe= $row->{pause} + $row->{'wait'};

  if(defined($summe_alt) and $last_summe ... )
  {
    # einen Eintrag zurück springen
    $pos--;
    $pos=0 if($pos<0);
    $row=$storage[$pos];

    # aktualisieren eines Eintages:
    $dbh->do('Update vicidial_agent_log_temp Set gabcom_fehler=? Where user=?', undef, "AutoKorrektur", $row->{user});
      
    # weitere Änderungen
    ...
  }

  $user_alt = $row->{user};
  $time_alt = $row->{event_time};
  $summe_alt = $row->{pause_sec} + $row->{wait_sec} + $row->{dispo_sec} + $row->{talk_sec};
}

# Verbindung zur Datenbank beenden
$dbh->disconnect;


Was das ganze etwas komplizierter macht ist die Tatsache das dein Code mache DB-Einträge doppelt oder noch häufiger prüfen/verarbeiten kann. Du springst unter Umständen einen Eintrag zurück dann wieder vor. Wäre es sicher, dass ein Eintrag immer nur einmal geprüft werden soll, kann man den letzten Eintrag auch in einer Variable zwischenspeichern und bei Bedarf benutzen. Es wird aber aus dem Codefragmenten nicht klar was genau passieren soll.

EDIT: Ein "do" eingesetzt wo es sinnvoll ist
Last edited: 2010-07-08 17:16:32 +0200 (CEST)

View full thread Skript zum Durchlauf