Files
powershell/Dennis_Scripts/FindMissingTransactionsInSQL.ps1
2023-03-09 09:06:25 +01:00

177 lines
6.7 KiB
PowerShell

$csv = Import-Csv -Delimiter ';' -Path "\\client\c$\Users\m.nielsen\Documents\Thales\SV1612090061\data.csv"
$group = $csv | group CardEngravedID
$sqlConnection = new-object System.Data.SqlClient.SqlConnection
$sqlConnection.ConnectionString = 'Server=rejk-p-sql003\sql01;Database=AfcCookedIFSv2;Trusted_Connection=True;'
$sqlConnection.Open()
$sqlCommand = $sqlConnection.CreateCommand()
$missingATSN = New-Object System.Collections.Generic.List`[int`]
$foundATSN = New-Object System.Collections.Generic.List`[int`]
$missingTransactions = New-Object System.Collections.Generic.List`[object`]
$foundTransactions = New-Object System.Collections.Generic.List`[object`]
$i = 0
foreach($entry in $group) {
$i++
Write-Progress -Activity 'Looking' -Status "$i / $($group.Count)" -PercentComplete ($i * 100 / $group.Count)
if($entry.Group[0].KnownTransactionID -lt 0) { continue }
Write-Verbose "New entry:$($entry.Name)"
[int]$maxATSN = 0
[int]$minATSN = [int32]::MaxValue
$missingATSN.Clear()
$foundATSN.Clear()
foreach($item in $entry.Group) {
Write-Verbose ". New item - MissingATSN:$($item.MissingATSN) KnownTransactionID:$($item.KnownTransactionID)"
if([int]$item.MissingATSN -gt $maxATSN) {
$maxATSN = [int]$item.MissingATSN
}
if([int]$item.MissingATSN -lt $minATSN) {
$minATSN = [int]$item.MissingATSN
}
$missingATSN.Add([int]$item.MissingATSN)
}
##
Write-verbose "Missing ATSN:$(($missingATSN | sort) -join ', ')"
Write-Verbose "Finding CardEngravedID:$($entry.Name) ATSN BETWEEN $minATSN AND $maxATSN in ObjTransaction"
$sqlCommand.CommandText = @"
select t.TransactionID, t.ApplicationTransactionSequenceNumber as ATSN, t.TransactionMediaLastDeviceID as LastDeviceID, t.DeviceID, t.MsgReportDate from trk.objtransaction t with(readuncommitted)
where t.CardEngravedID = $($entry.Name)
and t.ApplicationTransactionSequenceNumber between $minATSN and $maxATSN
order by t.ApplicationTransactionSequenceNumber
"@
$foundCount = 0
try {
$reader = $sqlCommand.ExecuteReader()
if($reader.HasRows) {
while($reader.Read()) {
$msgReportDate = $reader['MsgReportDate']
$transactionID = $reader['TransactionID']
$ATSN = $reader['ATSN']
$lastDeviceID = $reader['LastDeviceID']
$deviceID = $reader['DeviceID']
if($missingATSN -contains $ATSN) {
Write-Verbose ". Found transaction - T.ID:$transactionID MRD:$msgReportDate ATSN:$ATSN DeviceID:$deviceID LastDeviceID:$lastDeviceID - Unexpected, supposed to be missing?"
$foundCount++
if(-not ($missingATSN.Remove([int]$ATSN))) {
Write-Warning "Couldn't remove ATSN:$ATSN from MissingATSN:$($missingATSN -join ', ')"
}
$foundATSN.Add([int]$ATSN)
$foundTransactions.Add(
[pscustomobject]@{
TransactionID = $transactionID
CardEngravedID = $entry.Name
ATSN = $ATSN
MsgReportDate = $msgReportDate
DeviceID = $deviceID
LastDeviceID = $lastDeviceID
Exception = $false
ExceptionText = $null
TransactionExceptionID = $null
}
)
}
else {
Write-Verbose ". Ignoring $ATSN"
}
}
}
}
finally {
$reader.Close()
}
Write-Verbose "Finding CardEngravedID:$($entry.Name) ATSN BETWEEN $minATSN AND $maxATSN in ObjTransactionException"
$sqlCommand.CommandText = @"
select te.TransactionID, te.TransactionExceptionID, te.ApplicationTransactionSequenceNumber as ATSN, te.TransactionMediaLastDeviceID as LastDeviceID, te.DeviceID, te.MsgReportDate, te.ExceptionText
from dcp.ObjTransactionException te with(readuncommitted)
where te.CardEngravedID = $($entry.Name)
and te.ApplicationTransactionSequenceNumber between $minATSN and $maxATSN
order by te.ApplicationTransactionSequenceNumber
"@
$exceptionCount = 0
try {
$reader = $sqlCommand.ExecuteReader()
if($reader.HasRows) {
while($reader.Read()) {
$transactionID = $reader['TransactionID']
$transactionExceptionID = $reader['TransactionExceptionID']
$ATSN = $reader['ATSN']
$lastDeviceID = $reader['LastDeviceID']
$deviceID = $reader['DeviceID']
$msgReportDate = $reader['MsgReportDate']
$exceptionText = $reader['ExceptionText']
if($missingATSN -contains $ATSN) {
Write-Verbose "Found exception - T.ID:$transactionID TEID:$transactionExceptionID MRD:$msgReportDate ATSN:$ATSN DeviceID:$deviceID LastDeviceID:$lastDeviceID - ExceptionText:$exceptionText"
$exceptionCount++
if(-not ($missingATSN.Remove([int]$ATSN))) {
Write-Warning "Couldn't remove ATNS:$ATSN from List:$($missingATSN -join ', ')"
}
$foundATSN.Add([int]$ATSN)
$foundTransactions.Add(
[pscustomobject]@{
TransactionID = $transactionID
CardEngravedID = $entry.Name
ATSN = $ATSN
MsgReportDate = $msgReportDate
DeviceID = $deviceID
LastDeviceID = $lastDeviceID
Exception = $true
ExceptionText = $exceptionText
TransactionExceptionID = $transactionExceptionID
}
)
}
}
}
}
finally {
$reader.Close()
}
Write-Verbose "Found $($foundCount + $exceptionCount) transactions for CardEngravedID:$($entry.Name) ATSN BETWEEN $minATSN AND $maxATSN` - FoundATSN:$($foundATSN -join ', ')"
if($missingATSN.Count -gt 0) {
Write-Warning "CardEngravedID:$($entry.Name) StartATSN:$minATSN EndATSN:$maxATSN Missing ATSN:$($missingATSN -join ', ')"
foreach($ATSN in $missingATSN) {
$missingTransactions.Add(
[pscustomobject]@{
CardEngravedID = $entry.Name
ATSN = $ATSN
}
)
}
}
}