Rambler's Top100
Форум: MS ACCESSVBVBA MS OfficeMS SQL server
Новые сообщения: 0000

Форум: MS ACCESS

Вопросы связанные с MS ACCESS

Обновить визитку
Участники «Online»
Все участники

 
 

Доброго времени суток, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: сравнение двух файлов
 
 автор: Seryoga204   (17.07.2009 в 22:05)   личное сообщение
4 Кб.
 
 

Помогите реализовать! Появилась потребность в ежедневном сравнении 2-х файлов, а имено структура файла это счета с остатками и оборотами: начинаются на 10,11,20,21 - это остатки; 50,51 -оборот по дебету; 60,61 - оборот по кредиту. Задача состоит в следующем остатки по счетам в 1 файле 10,11,20,21 от них минусовать оборот 50,51 со 2 файла , прибавлять оборот 60,61 со 2 файла и полученый результат сравнивать с остатками 2 файла 10,11,20,21. Вот пример есть счет с остатком в предидущем дне 10380003643=1635963 (файл1), дебетовый оборот в текущем дне 50380003643=33531 (файл 2 ) , кредитовй оборот 60380003643=76213 (файл2) и текущий остаток 10380003643=1628530 (файл 2). Расчет 1635963-33531+76213=1678645-1628530=расхождение 50115, где перед равно 10,50,60 это то что я описал выше, а 380003643 номер счета. Помогите можно ли это както автоматизовать. Прикладываю два файла на основе которых показывал пример

  Ответить  
 
 автор: Гоблин   (17.07.2009 в 22:25)   личное сообщение
 
 

Вот это задачка! А в экселе не пробовали все это сделать?

  Ответить  
 
 автор: Seryoga204   (17.07.2009 в 22:40)   личное сообщение
 
 

пробывал что то не получается

  Ответить  
 
 автор: Гоблин   (17.07.2009 в 22:50)   личное сообщение
 
 

Ну так у вас же 12-разрядов - счет. Разрывается знаком "=". Отделить не проблема. Скопировать с одного файла в колонку, затем с другого и поехали.
Можно конечно и в акс перевести, проще запросами делать.

  Ответить  
 
 автор: Seryoga204   (17.07.2009 в 23:11)   личное сообщение
 
 

Я бы в эксель мог бы экспортировать и делать расчет. но это будет человек который пока не совсем дружит с эксель. хотелось бы как то это упростить.количество счетов не всегда равно в файлах, если в этом дне движения по счету не было то и оборотов в файле по нему не будет а остаток 10ХХХХХХХ(1файла )будет=10ХХХХХХХ(2файла). как сделать чтобы показатели в формулу отбирались по имени счета ?

  Ответить  
 
 автор: Гоблин   (17.07.2009 в 23:19)   личное сообщение
41 Кб.
 
 

Вот примерно так. Копировать и вставлять со строки 2. Далее все разделится. Попробуй формулу закатать хотя бы на несколько штук, там видно будет.
Похоже надо действительно в аксе. Но надо немного подумать. Там ничего сложного не должно быть. Если никто не опередит, то завтра.
И вообще, почему в текстовом файле?

  Ответить  
 
 автор: Seryoga204   (17.07.2009 в 23:35)   личное сообщение
35 Кб.
 
 

да в эксель стандартно формулу подставить не получится, в нем видно что количество операций по счетам в предыдущем дне (файл1) меньше чем в текущем(файл2)

  Ответить  
 
 автор: Гоблин   (17.07.2009 в 23:57)   личное сообщение
37 Кб.
 
 

Заметил. Да еще и количество знаков в строке разное. Не корректно получилось. Подправил.
Но это не проблема. Проблема в том, куда девать лишние строки. На 10,11 в первом файле получается больше, чем на 10,11 во втором. Сравнивать-то надо как-то.
А если по стобцам выдать в экселе. 10,11,21,22 - один столбец. 50,51 - второй стобец.

Хотя. Если количество разное, то и в аксе лишние будут. Чего с ними делать? Функция IF и там и там есть. Условие только вставить.

  Ответить  
 
 автор: Гоблин   (18.07.2009 в 00:19)   личное сообщение
 
 

Заметил, что счета в 1 и 2 файле перекликаются. Но какой из кредитов и дебитов к какому привязать? По поиску получилось *380003643 - куча на 10, 11, 50, 60.
Выходит, что каждому счету в 1 файле начинающемуся с 10, 11, 21, 22 соответствует такой же счет кредита во втором файле начинающийся на 50, 51 и дебита начинающийся с 60, 61. Да и количество этих счетов разное, да и не по порядку идут. Т.е. надо искать, упорядочить.
Задача усложняется. Так?
Попробуем.

  Ответить  
 
 автор: Lukas   (18.07.2009 в 02:10)   личное сообщение
19 Кб.
 
 

Создаем в базе две связанные таблички к текстовым файлам с разделителем "=",
Первое поле текстовое, называем "Account"
Второе поле денежное, называем "Amount".
Называем таблички соответственно "1txt" и "2txt".
Создаем запрос, и смотрим в нем разницу:

SELECT u.Acc As [Счет], Sum(u.Amn) As [Разница] FROM (
SELECT Mid(t1.Account,3) As Acc, t1.Amount As Amn FROM 1txt t1 WHERE Left(t1.Account,2) In ('10','11','20','21')
UNION ALL
SELECT Mid(t2.Account,3) As 1, -t2.Amount As 2 FROM 2txt t2  WHERE Left(t2.Account,2) In ('50','51')
UNION ALL
SELECT Mid(t3.Account,3) As 3, t3.Amount  As 4 FROM 2txt t3 WHERE Left(t3.Account,2) In ('60','61')
UNION ALL
SELECT Mid(t4.Account,3) As 5, -t4.Amount As 6 FROM 2txt t4 WHERE Left(t4.Account,2) In ('10','11','20','21')) u
Group By u.Acc
Order By u.Acc

Кстати ваша арифметика в примере расчета не учитывает 51 и 61 счета.
Если все получиться, в дальнейшем достаточно будет заменить текстовые файлы, все должно будет продолжить работать на последующие дни.

В прицепе бд с импортированными таблицами и запрос с результатами к ним.

  Ответить  
 
 автор: Гоблин   (18.07.2009 в 13:06)   личное сообщение
 
 

За Лукасом не угнаться.

  Ответить  
 
 автор: Seryoga204   (18.07.2009 в 19:48)   личное сообщение
 
 

Всем спасибо все получилось

  Ответить  
 
 автор: Seryoga204   (19.07.2009 в 01:19)   личное сообщение
 
 

Lukas
все работает на ура, только сейчас досмотрел: надо если счет остатка начинается на 10 в первом файле то 10сч (первый файл) + 50сч (второй файл) - 60сч (второй файл)- 10сч (второй файл) = расхождение остатков, а если на 20, то то 20сч (первый файл) - 50сч (второй файл) + 60сч (второй файл)- 10сч (второй файл) = расхождение остатков. Помогите доработать а то в Sql запросах я полный ноль

  Ответить  
 
 автор: Гоблин   (19.07.2009 в 17:20)   личное сообщение
 
 

Вот об этом я и спрашивал. Если в первом файле на 10сч меньше чем во втором файле на 10сч, куда девать нереализованные со второго счета?

  Ответить  
 
 автор: Гоблин   (19.07.2009 в 18:33)   личное сообщение
10 Кб.
 
 

Вот глянь пожалуста. Может не так изящно как у Лукаса, но если ничего не напутал, то вроде работает.
Поясняю:
1. Из прилинкованных текстовых файлов групповыми запросами выбираю счета на 10,11,20,21 из файла1. Тут же отделяю от номеров счета эти 10,11,20,21 и сгруппировав (счет может встечаться 10 раз?) вывожу сумму.
2. То же делаю двумя другими на 50,51 и 60,61 из второго текстового файла.
3. Вычисляю разницу и сумму по соответствующим счетам. (может он на 10 начинаться в первом файле, а во втором на 51) - это не важно. Запрос вычисление разницы и суммы.
4. Сравниваю - из получившегося вычисляю значения соответствующих счетов из файла 2. (может наоборот?) Там сами разберетесь.
Так?

PS данные вами текстовые файлы необходимо на рабочий стол выложить вместе с базой.

  Ответить  
 
 автор: Гоблин   (19.07.2009 в 20:56)   личное сообщение
11 Кб.
 
 

Чагой-то ни с децил впарился.
Там оказалось при детальном рассмотрении один и тот же счет на 50, 51 может быть.
Кароче в итоге получается по 59 строк в ставнении. Или не так. Вот.

  Ответить  
 
 автор: Seryoga204   (19.07.2009 в 21:26)   личное сообщение
 
 

Гоблин спасибо но
что то не получается. Если брать запрос Лукаса (в оригинале он считает отлично расхождения для счетов начинающихся на 20,21, если поменять в нем местами 50,51 и 60,61 то правильно считает для счетов начинающихся на 10,11)а надо вместо 10.11.20.21(txt1)-50.51(txt2)+60.61(txt2)-10.11.21.20(txt2) объеденить два запроса 10,11(txt1)+50.51(txt2)-60.61(txt2)-10.11(txt2) и 20,21(txt1)-50.51(txt2)+60.61(txt2)-20,21(txt2) у самого не получается

  Ответить  
 
 автор: Гоблин   (19.07.2009 в 22:37)   личное сообщение
12 Кб.
 
 

Ну если ты вычислил как что считает, то в чем же проблема?
Только Лукаса может исправить сам Лукас. Посмотри правильность счета в моем примере. Там все запросы наизнанку вывернул. Если правильно, то можно будет объединить сравнения.

У меня не работет его запрос на объединение. Но если меняя местами 50 и прочее, то может усовершенствовать типа:
SELECT u.Acc As [Счет], Sum(u.Amn) As [Разница] FROM (
SELECT Mid(t1.Account,3) As Acc, t1.Amount As Amn FROM 1txt t1 WHERE Left(t1.Account,2) In ('20','21')
UNION ALL
SELECT Mid(t2.Account,3) As 1, -t2.Amount As 2 FROM 2txt t2 WHERE Left(t2.Account,2) In ('50','51')
UNION ALL
SELECT Mid(t3.Account,3) As 3, t3.Amount As 4 FROM 2txt t3 WHERE Left(t3.Account,2) In ('60','61')
UNION ALL
SELECT Mid(t4.Account,3) As 5, -t4.Amount As 6 FROM 2txt t4 WHERE Left(t4.Account,2) In ('20','21')) u
Union
SELECT u.Acc As [Счет], Sum(u.Amn) As [Разница] FROM (
SELECT Mid(t1.Account,3) As Acc, t1.Amount As Amn FROM 1txt t1 WHERE Left(t1.Account,2) In ('10','11')
UNION ALL
SELECT Mid(t2.Account,3) As 1, -t2.Amount As 2 FROM 2txt t2 WHERE Left(t2.Account,2) In ('60','61')
UNION ALL
SELECT Mid(t3.Account,3) As 3, t3.Amount As 4 FROM 2txt t3 WHERE Left(t3.Account,2) In ('50','51')
UNION ALL
SELECT Mid(t4.Account,3) As 5, -t4.Amount As 6 FROM 2txt t4 WHERE Left(t4.Account,2) In ('10','11')) u

Group By u.Acc
Order By u.Acc

Т.е. как бы 2 запроса для разного в одном. Типа как в моей последней попытке. Может так?

  Ответить  
 
 автор: Seryoga204   (20.07.2009 в 20:45)   личное сообщение
 
 

Гоблин спасибо за помощь, но что то объединенный запрос не работает. Буду ждать Лукаса.

  Ответить  
 
 автор: Lukas   (21.07.2009 в 01:22)   личное сообщение
 
 


10,11(txt1)+50.51(txt2)-60.61(txt2)-10.11(txt2) и 20,21(txt1)-50.51(txt2)+60.61(txt2)-20,21(txt2)


Распишем:

10,11(txt1)+50.51(txt2)-60.61(txt2)-10.11(txt2)
Union
20,21(txt1)-50.51(txt2)+60.61(txt2)-20,21(txt2)

Невооруженным глазом видно, что выделенное жирным при объединении даст результат=0
Что остается:

10,11(txt1)-10.11(txt2)
Union
20,21(txt1)-20,21(txt2)

  Ответить  
 
 автор: Seryoga204   (21.07.2009 в 01:40)   личное сообщение
 
 

Lukas не всегда равно 0, а как все эт расписать в существующем запросе
SELECT u.Acc As [Счет], Sum(u.Amn) As [Разница] FROM ( 
SELECT Mid(t1.Account,3) As Acc, t1.Amount As Amn FROM 1txt t1 WHERE Left(t1.Account,2) In ('10','11','20','21') 
UNION ALL 
SELECT Mid(t2.Account,3) As 1, -t2.Amount As 2 FROM 2txt t2  WHERE Left(t2.Account,2) In ('50','51') 
UNION ALL 
SELECT Mid(t3.Account,3) As 3, t3.Amount  As 4 FROM 2txt t3 WHERE Left(t3.Account,2) In ('60','61') 
UNION ALL 
SELECT Mid(t4.Account,3) As 5, -t4.Amount As 6 FROM 2txt t4 WHERE Left(t4.Account,2) In ('10','11','20','21')) u 
Group By u.Acc 
Order By u.Acc

а то что то не получается.Заранее спасибо

  Ответить  
 
 автор: Lukas   (21.07.2009 в 06:43)   личное сообщение
 
 


Lukas не всегда равно 0...


Это точно, Lukas не всегда равно 0.
Так же точно и то, что: A-B-A+B всегда равно 0.

SELECT u.Acc AS Счет, Sum(u.Amn) AS Разница
FROM (
SELECT Mid(t1.Account,3) As Acc, t1.Amount As Amn FROM New1txt t1 WHERE Left(t1.Account,2) In ('10','11','20','21')
UNION ALL
SELECT Mid(t4.Account,3) As 5, -t4.Amount As 6 FROM New2txt t4 WHERE Left(t4.Account,2) In ('10','11','20','21')
) u
GROUP BY u.Acc
ORDER BY u.Acc;

Вариант с 50 и 60 счетами.

SELECT u.Acc AS Счет, Sum(u.Amn) AS Разница FROM (
SELECT Mid(t1.Account,3) As Acc, t1.Amount As Amn FROM New1txt t1 WHERE Left(t1.Account,2) In ('10','11')
UNION ALL
SELECT Mid(t2.Account,3) As 1, t2.Amount As 2 FROM New2txt t2  WHERE Left(t2.Account,2) In ('50','51')
UNION ALL
SELECT Mid(t3.Account,3) As 3, -t3.Amount  As 4 FROM New2txt t3 WHERE Left(t3.Account,2) In ('60','61')
UNION ALL
SELECT Mid(t4.Account,3) As 5, -t4.Amount As 6 FROM New2txt t4 WHERE Left(t4.Account,2) In ('10','11')
UNION ALL
SELECT Mid(t5.Account,3) As Acc, t5.Amount As Amn FROM New1txt t5 WHERE Left(t5.Account,2) In ('20','21')
UNION ALL
SELECT Mid(t6.Account,3) As 1, -t6.Amount As 2 FROM New2txt t6  WHERE Left(t6.Account,2) In ('50','51')
UNION ALL
SELECT Mid(t7.Account,3) As 3, t7.Amount  As 4 FROM New2txt t7 WHERE Left(t7.Account,2) In ('60','61')
UNION ALL
SELECT Mid(t8.Account,3) As 5, -t8.Amount As 6 FROM New2txt t8 WHERE Left(t8.Account,2) In ('20','21')
) u
GROUP BY u.Acc
ORDER BY u.Acc;

Найдите отличия в результатах.

  Ответить  
 
 автор: Seryoga204   (21.07.2009 в 15:04)   личное сообщение
 
 

Это точно, Lukas не всегда равно 0.   

Не так выразился, сорри.

SELECT u.Acc AS Счет, Sum(u.Amn) AS Разница FROM ( 
SELECT Mid(t1.Account,3) As Acc, t1.Amount As Amn FROM New1txt t1 WHERE Left(t1.Account,2) In ('10','11') 
UNION ALL 
SELECT Mid(t2.Account,3) As 1, t2.Amount As 2 FROM New2txt t2  WHERE Left(t2.Account,2) In ('50','51') 
UNION ALL 
SELECT Mid(t3.Account,3) As 3, -t3.Amount  As 4 FROM New2txt t3 WHERE Left(t3.Account,2) In ('60','61') 
UNION ALL 
SELECT Mid(t4.Account,3) As 5, -t4.Amount As 6 FROM New2txt t4 WHERE Left(t4.Account,2) In ('10','11') 
UNION ALL 
SELECT Mid(t5.Account,3) As Acc, t5.Amount As Amn FROM New1txt t5 WHERE Left(t5.Account,2) In ('20','21') 
UNION ALL 
SELECT Mid(t6.Account,3) As 1, -t6.Amount As 2 FROM New2txt t6  WHERE Left(t6.Account,2) In ('50','51') 
UNION ALL 
SELECT Mid(t7.Account,3) As 3, t7.Amount  As 4 FROM New2txt t7 WHERE Left(t7.Account,2) In ('60','61') 
UNION ALL 
SELECT Mid(t8.Account,3) As 5, -t8.Amount As 6 FROM New2txt t8 WHERE Left(t8.Account,2) In ('20','21') 
) u 
GROUP BY u.Acc 
ORDER BY u.Acc;
Данный код не учитывает остатки.10,11,20,21. Расчитывается только разность между 50,51 и 60,61. А вот если отдельно использовать
SELECT u.Acc As [Счет], Sum(u.Amn) As [Разница] FROM ( 
SELECT Mid(t1.Account,3) As Acc, t1.Amount As Amn FROM 1txt t1 WHERE Left(t1.Account,2) In ('20','21') 
UNION ALL 
SELECT Mid(t2.Account,3) As 1, -t2.Amount As 2 FROM 2txt t2  WHERE Left(t2.Account,2) In ('50','51') 
UNION ALL 
SELECT Mid(t3.Account,3) As 3, t3.Amount  As 4 FROM 2txt t3 WHERE Left(t3.Account,2) In ('60','61') 
UNION ALL 
SELECT Mid(t4.Account,3) As 5, -t4.Amount As 6 FROM 2txt t4 WHERE Left(t4.Account,2) In ('20','21')) u 
Group By u.Acc 
Order By u.Acc

правильно считает для счетов 20,21. А отдельно запрос -
SELECT u.Acc As [Счет], Sum(u.Amn) As [Разница] FROM ( 
SELECT Mid(t1.Account,3) As Acc, t1.Amount As Amn FROM 1txt t1 WHERE Left(t1.Account,2) In ('10','11') 
UNION ALL 
SELECT Mid(t2.Account,3) As 1, -t2.Amount As 2 FROM 2txt t2  WHERE Left(t2.Account,2) In ('60','61') 
UNION ALL 
SELECT Mid(t3.Account,3) As 3, t3.Amount  As 4 FROM 2txt t3 WHERE Left(t3.Account,2) In ('50','51') 
UNION ALL 
SELECT Mid(t4.Account,3) As 5, -t4.Amount As 6 FROM 2txt t4 WHERE Left(t4.Account,2) In ('10','11')) u 
Group By u.Acc 
Order By u.Acc

правильно считает расхождения по счетам 10,11.
Задача всей этой аферы заключается в том чтобы обнаружить расхождения. Когда остаток вчерашнего дня(20,21 в файле 1) - оборот по дебиту(50,51 в файле 2) +оборот по кредиту(60,61в файле 2) = в идеале должнны выйти на текущий остаток(для счетов 20,21 в файле 2) и наоборот для счетов 10,11(10,11 в файле 1)+ оборот по дебиту(50,51 в файле 2) -оборот по кредиту(60,61в файле 2) = в идеале должнны выйти на текущий остаток(для счетов 10,11 в файле 2). Уже мозги плавятся Объединенный запрос что то не получается сделать

  Ответить  
 
 автор: Lukas   (21.07.2009 в 15:48)   личное сообщение
 
 


Данный код не учитывает остатки.10,11,20,21. Расчитывается только разность между 50,51 и 60,61.


"Броня крепка, и танки наши быстры..."

  Ответить  
 
 автор: Seryoga204   (21.07.2009 в 19:56)   личное сообщение
 
 

Ладно, Спасибо всем за помощь. Буду разбираться.

  Ответить  
 
 автор: Lukas   (22.07.2009 в 00:56)   личное сообщение
 
 

Вот специально еще одного монстра соорудил, для проверки.
Раскидал счета по столбикам для наглядности + итоги.
И в итоге: имеем тот-же результат, что и в предыдущих двух запросах:

SELECT u.Acc As Счет, Sum(a1011) As [1011(1)], Sum(a2021) As [2021(1)], Sum(a5051) As [5051(2)], Sum(a6061) As [6061(2)], Sum(a10112) As [1011(2)], Sum(a20212) As [2021(2)],  
Sum(a1011) + Sum(a5051) - Sum(a6061) - Sum(a10112) As [1011(1)+5060(2)-6061(2)-1011(2)], 
Sum(a2021) - Sum(a5051) + Sum(a6061) - Sum(a20212) As [2021(1)-5060(2)+6061(2)-2021(2)],
Sum(a1011) + Sum(a5051) - Sum(a6061) - Sum(a10112) + Sum(a2021) - Sum(a5051) + Sum(a6061) - Sum(a20212) As [Итог10+Итог20]
FROM 
(
SELECT Mid(t1.Account,3) As Acc, t1.Amount As a1011, 0 As a2021, 0 As a5051, 0 As a6061, 0 As a10112, 0 As a20212 FROM New1txt t1 WHERE Left(t1.Account,2) In ('10','11')
UNION ALL
SELECT Mid(t1.Account,3) As Acc, 0 As a1011, t1.Amount  As a2021, 0 As a5051, 0 As a6061, 0 As a10112, 0 As a20212 FROM New1txt t1 WHERE Left(t1.Account,2) In ('20','21')
UNION ALL
SELECT Mid(t2.Account,3) As Acc, 0 As a1011, 0 As a2021, t2.Amount  As a5051, 0 As a6061, 0 As a10112, 0 As a20212 FROM New2txt t2 WHERE Left(t2.Account,2) In ('50','51')
UNION ALL
SELECT Mid(t2.Account,3) As Acc, 0 As a1011, 0 As a2021, 0 As a5051, t2.Amount As a6061, 0 As a10112, 0 As a20212 FROM New2txt t2 WHERE Left(t2.Account,2) In ('60','61')
UNION ALL
SELECT Mid(t2.Account,3) As Acc, 0 As a1011, 0 As a2021, 0 As a5051, 0 As a6061, t2.Amount As a10112, 0 As a20212 FROM New2txt t2 WHERE Left(t2.Account,2) In ('10','11')
UNION ALL
SELECT Mid(t2.Account,3) As Acc, 0 As a1011, 0 As a2021, 0 As a5051, 0 As a6061, 0 As a10112, t2.Amount As a20212 FROM New2txt t2 WHERE Left(t2.Account,2) In ('20','21')
) u
GROUP BY u.Acc
ORDER BY u.Acc;

  Ответить  
HiProg.com - Технологии программирования
Rambler's Top100 TopList