Доброго времени суток, Посетитель!
|
|
|
|
|
|
|
|
|
вид форума:
|
|
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 номер счета. Помогите можно ли это както автоматизовать. Прикладываю два файла на основе которых показывал пример | |
|
| |
|
|
|
| Вот это задачка! А в экселе не пробовали все это сделать? | |
|
| |
|
|
|
| пробывал что то не получается | |
|
| |
|
|
|
| Ну так у вас же 12-разрядов - счет. Разрывается знаком "=". Отделить не проблема. Скопировать с одного файла в колонку, затем с другого и поехали.
Можно конечно и в акс перевести, проще запросами делать. | |
|
| |
|
|
|
| Я бы в эксель мог бы экспортировать и делать расчет. но это будет человек который пока не совсем дружит с эксель. хотелось бы как то это упростить.количество счетов не всегда равно в файлах, если в этом дне движения по счету не было то и оборотов в файле по нему не будет а остаток 10ХХХХХХХ(1файла )будет=10ХХХХХХХ(2файла). как сделать чтобы показатели в формулу отбирались по имени счета ? | |
|
| |
|
41 Кб. |
|
| Вот примерно так. Копировать и вставлять со строки 2. Далее все разделится. Попробуй формулу закатать хотя бы на несколько штук, там видно будет.
Похоже надо действительно в аксе. Но надо немного подумать. Там ничего сложного не должно быть. Если никто не опередит, то завтра.
И вообще, почему в текстовом файле? | |
|
| |
|
35 Кб. |
|
| да в эксель стандартно формулу подставить не получится, в нем видно что количество операций по счетам в предыдущем дне (файл1) меньше чем в текущем(файл2) | |
|
| |
|
37 Кб. |
|
| Заметил. Да еще и количество знаков в строке разное. Не корректно получилось. Подправил.
Но это не проблема. Проблема в том, куда девать лишние строки. На 10,11 в первом файле получается больше, чем на 10,11 во втором. Сравнивать-то надо как-то.
А если по стобцам выдать в экселе. 10,11,21,22 - один столбец. 50,51 - второй стобец.
Хотя. Если количество разное, то и в аксе лишние будут. Чего с ними делать? Функция IF и там и там есть. Условие только вставить. | |
|
| |
|
|
|
| Заметил, что счета в 1 и 2 файле перекликаются. Но какой из кредитов и дебитов к какому привязать? По поиску получилось *380003643 - куча на 10, 11, 50, 60.
Выходит, что каждому счету в 1 файле начинающемуся с 10, 11, 21, 22 соответствует такой же счет кредита во втором файле начинающийся на 50, 51 и дебита начинающийся с 60, 61. Да и количество этих счетов разное, да и не по порядку идут. Т.е. надо искать, упорядочить.
Задача усложняется. Так?
Попробуем. | |
|
| |
|
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 счета.
Если все получиться, в дальнейшем достаточно будет заменить текстовые файлы, все должно будет продолжить работать на последующие дни.
В прицепе бд с импортированными таблицами и запрос с результатами к ним. | |
|
| |
|
|
|
| За Лукасом не угнаться. | |
|
| |
|
|
|
| Всем спасибо все получилось | |
|
| |
|
|
|
| Lukas
все работает на ура, только сейчас досмотрел: надо если счет остатка начинается на 10 в первом файле то 10сч (первый файл) + 50сч (второй файл) - 60сч (второй файл)- 10сч (второй файл) = расхождение остатков, а если на 20, то то 20сч (первый файл) - 50сч (второй файл) + 60сч (второй файл)- 10сч (второй файл) = расхождение остатков. Помогите доработать а то в Sql запросах я полный ноль | |
|
| |
|
|
|
| Вот об этом я и спрашивал. Если в первом файле на 10сч меньше чем во втором файле на 10сч, куда девать нереализованные со второго счета? | |
|
| |
|
10 Кб. |
|
| Вот глянь пожалуста. Может не так изящно как у Лукаса, но если ничего не напутал, то вроде работает.
Поясняю:
1. Из прилинкованных текстовых файлов групповыми запросами выбираю счета на 10,11,20,21 из файла1. Тут же отделяю от номеров счета эти 10,11,20,21 и сгруппировав (счет может встечаться 10 раз?) вывожу сумму.
2. То же делаю двумя другими на 50,51 и 60,61 из второго текстового файла.
3. Вычисляю разницу и сумму по соответствующим счетам. (может он на 10 начинаться в первом файле, а во втором на 51) - это не важно. Запрос вычисление разницы и суммы.
4. Сравниваю - из получившегося вычисляю значения соответствующих счетов из файла 2. (может наоборот?) Там сами разберетесь.
Так?
PS данные вами текстовые файлы необходимо на рабочий стол выложить вместе с базой. | |
|
| |
|
11 Кб. |
|
| Чагой-то ни с децил впарился.
Там оказалось при детальном рассмотрении один и тот же счет на 50, 51 может быть.
Кароче в итоге получается по 59 строк в ставнении. Или не так. Вот. | |
|
| |
|
|
|
| Гоблин спасибо но
что то не получается. Если брать запрос Лукаса (в оригинале он считает отлично расхождения для счетов начинающихся на 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) у самого не получается | |
|
| |
|
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 запроса для разного в одном. Типа как в моей последней попытке. Может так? | |
|
| |
|
|
|
| Гоблин спасибо за помощь, но что то объединенный запрос не работает. Буду ждать Лукаса. | |
|
| |
|
|
|
|
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)
|
| |
|
| |
|
|
|
| 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 не всегда равно 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;
|
Найдите отличия в результатах. | |
|
| |
|
|
|
|
Это точно, 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). Уже мозги плавятся Объединенный запрос что то не получается сделать | |
|
| |
|
|
|
|
Данный код не учитывает остатки.10,11,20,21. Расчитывается только разность между 50,51 и 60,61.
|
"Броня крепка, и танки наши быстры..." | |
|
| |
|
|
|
| Ладно, Спасибо всем за помощь. Буду разбираться. | |
|
| |
|
|
|
| Вот специально еще одного монстра соорудил, для проверки.
Раскидал счета по столбикам для наглядности + итоги.
И в итоге: имеем тот-же результат, что и в предыдущих двух запросах:
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 - Технологии программирования
|