Последовательное уменьшение значений в таблице значений

1. veritasuna12 3 06.11.19 08:09 Сейчас в теме
Коллеги подскажите алгоритм последовательного уменьшения значений Таблицы1 значениями Таблицы2, результирующая Таблица3

Таблица1
1. Номенклатура1 2 Поле1
2. Номенклатура1 3 Поле2
3. Номенклатура2 1 Поле3
4. Номенклатура2 1 Поле4
5. Номенклатура2 1 Поле5

Таблица2
1. Номенклатура1 3
2. Номенклатура2 2

Таблица3
1. Номенклатура1 2 Поле2
2. Номенклатура2 1 Поле5
+
По теме из базы знаний
Найденные решения
9. Sashares 34 06.11.19 09:41 Сейчас в теме
(7) В (3) посмотрите, там все написано.
А по поводу алгоритма - цикл в цикле. В первом цикле обходить таблицу 2, во внутреннем цикле обходить таблицу 1. И условие - если строка таблицы 1 по номенклатуре подходит, уменьшаем количество. Когда количество в строке таблицы 1 будет ноль, добавляем строку в массив для последующего удаления.
DmitriyPopow; veritasuna12; +2
17. veritasuna12 3 06.11.19 10:31 Сейчас в теме
(9)По сути всё верно. Цикл без удаления строк просто с занулением такой :

Для каждого Стр2 Из ТЗ2 Цикл
					
					Пока Стр2.Количество <> 0 Цикл
						
						Для Каждого Стр1 Из ТЗ1 Цикл
							
							Если Стр1.Номенклатура = Стр2.Номенклатура Тогда
								
								Если Стр1.Количество > Стр2.Количество Тогда
									
									Стр1.Количество = Стр1.Количество-Стр2.Количество;
									Стр2.Количество = 0;
									
								ИначеЕсли Стр1.Количество = Стр2.Количество Тогда
									
									Стр1.Количество = 0;
									Стр2.Количество = 0;
									
								ИначеЕсли Стр1.Количество < Стр2.Количество Тогда
									
									Стр2.Количество = Стр2.Количество-Стр1.Количество;
									Стр1.Количество = 0;
									
								КонецЕсли;
							КонецЕсли;
							
						КонецЦикла;	
						
					КонецЦикла;
					
				КонецЦикла;

Показать


Глаза боятся, руки делают..
+
20. kasper076 103 07.11.19 12:21 Сейчас в теме
(17)
Для каждого Стр2 Из ТЗ2 Цикл
	НайденныеСтрокиТЗ1 = ТЗ1.НайтиСтроки(Новый Структура("Номенклатура", Стр2.Номенклатура));
	Кол_во = Стр2.Количество;
	Для Каждого Стр1 Из НайденныеСтрокиТЗ1 Цикл
		Если Стр1.Количество < Кол_во Тогда
			Кол_во = Кол_во - Стр1.Количество;
			Стр1.Количество = 0;
		Иначе
			Стр1.Количество = Стр1.Количество - Кол_во;
			Прервать;
		КонецЕсли;
	КонецЦикла;    
КонецЦикла;
Показать
+
Остальные ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
2. DmitriyPopow 33 06.11.19 08:12 Сейчас в теме
покрутил и так и так. не понял алгоритм который имеется ввиду, можно "на пальцах" пояснить?)
alex-l19041; +1
3. veritasuna12 3 06.11.19 08:19 Сейчас в теме
Принципиально уменьшать количество последовательно. Вычитаем строку 1 Таблицы2: сначала из первой строки Таблицы1, т. к. в первой строке колличество меньше вычитаемого, то первая строка Таблицы1 уходит в ноль, а оставшееся количество уже вычитаем из второй строки....
+
4. DmitriyPopow 33 06.11.19 09:13 Сейчас в теме
1) Запросами т.е. первые 2 тч загнать в запрос. там соединиться по ключевым полям, далее обходя результат запроса по группировке Номенклатура (как с партиями например, только тут не документ партии и номенклатура) , и формируем результирующий тз
2) в цикле обходим таблицу 2, находим строки по Номенклатуре в ТЗ1, уменьшаем количество пока наше количество из тз2 не станет равно 0, Потом удаляем строки из тз1 у которых количество = 0, можно сразу сформировать массив строк в первом цикле и потом обойти его и удалить строки, но тут надо аккуратно, отсортировать строки перед циклом в обеих ТЗ чтобы не удалить не ту строку случайно после удаления строки поднимаются и можно удалить не ту
+
5. YannikAlx 43 06.11.19 09:21 Сейчас в теме
каким боком тут Поле 1,2,3,4,5 ?
по какому закону вы его тулите в 3 таблицу?
+
6. DmitriyPopow 33 06.11.19 09:26 Сейчас в теме
(5)представьте что 1 таблица это данные документа, 2 таблица это остатки в регистре. и надо получить то что осталось не списано после списание по партиям. поле 1,2.... не кое поле из тч документа например сумма Номенклатурная группа, статья затрат...
veritasuna12; +1
7. YannikAlx 43 06.11.19 09:33 Сейчас в теме
(6) Совершенно не понятно....
КАК получается вот такой результат? Почему в результате Поле2 а не Поле 1 ?

Номенклатура1 2 Поле1
+ Номенклатура1 3 Поле2

- Номенклатура1 3

= Номенклатура1 2 Поле2
+
8. DmitriyPopow 33 06.11.19 09:38 Сейчас в теме
(7) у нас 2 строки в первой таблице по номенклатура1, во второй количество = 3
идем по строкам 1 таблицы, из первой строки кол = 2 - 3 = - 1 т.е. кол в 1 строке считаем равно 0 и еще 1 остается от 3, во сторой строке вычитаем из кол = 3 - 1 = 2. эта строка остается в таблице т.к. ее количество <> 0 соответственно поле2, а не поле1 , если отсрортируется строки по другому то будет другой результат да. но в примере строки отсортированы так
veritasuna12; +1
10. YannikAlx 43 06.11.19 09:53 Сейчас в теме
(8)
С трудом разобрался в логике...
+
11. Sashares 34 06.11.19 09:54 Сейчас в теме
(10)
Я хочу услышать ответ автора...
в (3)
+
12. YannikAlx 43 06.11.19 09:56 Сейчас в теме
(11) Вы ввели сначала в заблуждение... Ибо в (2) ответ - супер...

Спасибо что откорректировали 2 на 3...
+
13. Sashares 34 06.11.19 09:58 Сейчас в теме
(12)Да, извиняюсь, перепутал сначала.
+
9. Sashares 34 06.11.19 09:41 Сейчас в теме
(7) В (3) посмотрите, там все написано.
А по поводу алгоритма - цикл в цикле. В первом цикле обходить таблицу 2, во внутреннем цикле обходить таблицу 1. И условие - если строка таблицы 1 по номенклатуре подходит, уменьшаем количество. Когда количество в строке таблицы 1 будет ноль, добавляем строку в массив для последующего удаления.
DmitriyPopow; veritasuna12; +2
17. veritasuna12 3 06.11.19 10:31 Сейчас в теме
(9)По сути всё верно. Цикл без удаления строк просто с занулением такой :

Для каждого Стр2 Из ТЗ2 Цикл
					
					Пока Стр2.Количество <> 0 Цикл
						
						Для Каждого Стр1 Из ТЗ1 Цикл
							
							Если Стр1.Номенклатура = Стр2.Номенклатура Тогда
								
								Если Стр1.Количество > Стр2.Количество Тогда
									
									Стр1.Количество = Стр1.Количество-Стр2.Количество;
									Стр2.Количество = 0;
									
								ИначеЕсли Стр1.Количество = Стр2.Количество Тогда
									
									Стр1.Количество = 0;
									Стр2.Количество = 0;
									
								ИначеЕсли Стр1.Количество < Стр2.Количество Тогда
									
									Стр2.Количество = Стр2.Количество-Стр1.Количество;
									Стр1.Количество = 0;
									
								КонецЕсли;
							КонецЕсли;
							
						КонецЦикла;	
						
					КонецЦикла;
					
				КонецЦикла;

Показать


Глаза боятся, руки делают..
+
19. Sashares 34 06.11.19 10:33 Сейчас в теме
(17)Пока Стр2.Количество <> 0 Цикл - этот цикл лишний.
Если у вас вдруг в таблице 2 количество будет больше чем в таблице 1, то из-за этого будет бесконечный цикл.
А если меньше, то и без этого цикла все будет работать.
+
20. kasper076 103 07.11.19 12:21 Сейчас в теме
(17)
Для каждого Стр2 Из ТЗ2 Цикл
	НайденныеСтрокиТЗ1 = ТЗ1.НайтиСтроки(Новый Структура("Номенклатура", Стр2.Номенклатура));
	Кол_во = Стр2.Количество;
	Для Каждого Стр1 Из НайденныеСтрокиТЗ1 Цикл
		Если Стр1.Количество < Кол_во Тогда
			Кол_во = Кол_во - Стр1.Количество;
			Стр1.Количество = 0;
		Иначе
			Стр1.Количество = Стр1.Количество - Кол_во;
			Прервать;
		КонецЕсли;
	КонецЦикла;    
КонецЦикла;
Показать
+
14. YannikAlx 43 06.11.19 10:00 Сейчас в теме
Остался вопрос о порядке строк в таблицах...
На основании чего устанавливается порядок следования строк?
Это очень важно, потому что если отнимать сначала от второй строки, то результат будет
Номенклатура1 2 Поле 1
Из за чего и возник изначально вопрос о способе получения Поля в результате...
+
15. DmitriyPopow 33 06.11.19 10:23 Сейчас в теме
(14) да пусть будет положение луны в пространстве, алгоритм не изменится)
+
16. YannikAlx 43 06.11.19 10:26 Сейчас в теме
(15) Привел вам пример если первая строка в 1 таблице - будет второй то результат будет другим...
, то есть положение луны меняет результат все же...
+
18. DmitriyPopow 33 06.11.19 10:32 Сейчас в теме
(16) Согласен, результат разный, но алгоритм один, меняются исходные данные. аля списание партий по FIFO LIFO. именно алгоритм и просили подсказать
+
Внимание! Тема сдана в архив

Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот