Как выбрать и экспортировать 5000 строк дебетовых и кредитных операций одновременно и сбалансировать дебеты и кредиты до нуля? - PullRequest
0 голосов
/ 19 февраля 2019

Для системы ERP, на которую мы осуществляем миграцию, требуются файлы CSV с 5000 или менее строками для GL.Дебетовые и кредитные транзакции в каждом файле должны быть равны нулю.Существует несколько строк дебетовых и кредитных транзакций, которые имеют общий идентификатор транзакции.

Используя смещение и выборку далее, я смог извлечь 5000 строк за раз, однако кредиты и дебеты не сбалансированы.

Пример данных:

TranID  Credit  Debit   Balance Account#
1       250     0       250     ABC
1       0       250     0       DEF
2       0       100     -100    GHI
2       50      0       -50     JKL
2       50      0       0       MNO


declare @batchsize INT = 5000,
    @loopcount INT = 0;

while (@loopcount*@batchsize < (select  count(*) from [Apps2].[dbo].[GLTrans]))
begin
  SELECT *  FROM [Apps2].[dbo].[GLTrans]
  ORDER BY tranID
  offset (@batchsize * @loopcount) rows
  fetch next (@batchsize) rows only

  set @loopcount= @loopcount + 1
end

Ответы [ 2 ]

0 голосов
/ 19 февраля 2019

Используйте переменную таблицы, чтобы перебрать ваши данные.Вроде как использование курсора в Oracle ...

Если я правильно понимаю ваши примеры данных и мое предположение, что каждый transID устанавливает в 0 значение, вы меняете логику цикла так, чтобы она работала больше как do ...в то время как как этот пример здесь , где вы берете следующий набор транзакций и решаете, поддерживает ли он пакет ниже 5k.Это должно охватывать заполнение одной партии из 5000 или менее строк, которые равны 0 долл. США, при условии, что для каждого идентификатора транзакции установлено значение 0 долл. США

Declare @batchCursor TABLE (
    TransID INT,
    Credit INT, -- chose int for expediency 
    Debit INT,
    Balance INT,
    AccountNo Varchar(4)

),

@batchsize INT = 5000,
@rowCount INT = 0,
@transID INT = 1,
@transSize INT = 0;

while (@rowcount <= 5000)
BEGIN
    INSERT INTO @batchCursor
    SELECT * FROM [Apps2].[dbo].[GLTrans] -- you might need to enumerate all your column names
    WHERE TransID = @transID;

    SELECT @transSize = COUNT(*) FROM @batchCursor where TransID = @transID);

    IF(@transSize > 0)
        BEGIN
        IF (@transSize + @rowCount < @batchSize)
           BEGIN
           Set @rowCount += transSize;
           Set @transID += 1;
           END;
        END;
    ELSE Set @transID += 1;

IF((Select count(*) FROM [Apps2].[dbo].[GLTrans] WHERE TransID = @transID) + @rowCount > @batch)
BREAK;

END;
.
0 голосов
/ 19 февраля 2019

Простое решение - предварительно обработать все транзакции и назначить номер партии (для каждого CSV-файла).Во временной таблице хранится количество строк на TranID.

Предполагается, что дебит и кредит будут сбалансированы для каждого TranID.

После этого вы можете сгенерировать CSV на основе временной таблицы.

-- create the temp table
create table #trans
(
    TranID      int identity,
    Cnt         int,
    Batch       int
)

-- populate the temp table
insert into #trans (TranID, Cnt)
select TranID, Cnt = count(*)
from   [Apps2].[dbo].[GLTrans]
group by TranID

declare @batchsize  int = 5000,
        @batch      int = 1

while   exists (select * from #trans where Batch is null)
begin
    update  t
    set     Batch   = @batch 
    from
    (
        select  *, cumm = sum(Cnt) over (order by TranID)
        from    #trans
        where   Batch   is null
    ) t
    where   cumm    <= @batchsize 

    select  @batch = @batch + 1
end

--  Verify
select  *, sum(Cnt) over (partition by Batch order by TranID)
from    #trans 
order by TranID 
...