powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Помогите с UPDATE FROM
9 сообщений из 9, страница 1 из 1
Помогите с UPDATE FROM
    #33865886
foll-fill
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Всем привет
Возникла небольшая трудность, хотелось бы её решить с вашей помощью
Есть запрос

Код: plaintext
1.
2.
3.
4.
5.
Update curTaxWorkPeriod ;
	Set curTaxWorkPeriod.all_p2 = curTaxWorkPeriod.all_all    -T1.all_all;
	From curTax T1;
	Where  T1.period_id= 1  ;
	And  T1.factory_name=curTaxWorkPeriod.factory_name ;
	AND curTaxWorkPeriod.n_npl='4'


Данный запрос работает, однако если соответствющей записи в таблице T1 (curTax) нет, то по логике T1.all_all должно быть равно нулю и следовательно
curTaxWorkPeriod.all_p2 должно присваиваться значение curTaxWorkPeriod.all_all-0, а получается так, что curTaxWorkPeriod.all_p2, в этом случае, всегда равна нулю, вне зависимости от суммы curTaxWorkPeriod.all_all.
...
Рейтинг: 0 / 0
Помогите с UPDATE FROM
    #33865998
Sergey Ch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А если так (не проверял):

Код: plaintext
1.
2.
3.
4.
5.
Update curTaxWorkPeriod ;
	Set curTaxWorkPeriod.all_p2 = curTaxWorkPeriod.all_all    -NVL(T1.all_all, 0 ) ;
	From curTax T1;
	Where  T1.period_id= 1  ;
	And  T1.factory_name=curTaxWorkPeriod.factory_name ;
	AND curTaxWorkPeriod.n_npl='4'

P.S. Еще очень важно иметь везде пробел перед ";"
...
Рейтинг: 0 / 0
Помогите с UPDATE FROM
    #33866011
-=AlexiS=-
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вы неверно понимаете работу написаного запроса
В вашем случае проапдейтятся только те записи для которых соблюдено условие Where, остальные остануться нетронутыми. если хотите получить апдейт по всем записям, используйте left join
...
Рейтинг: 0 / 0
Помогите с UPDATE FROM
    #33866069
foll_fill
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
-=AlexiS=- Вы неверно понимаете работу написаного запроса
В вашем случае проапдейтятся только те записи для которых соблюдено условие Where, остальные остануться нетронутыми. если хотите получить апдейт по всем записям, используйте left join

Правильно я понимаю, я вопос может не в совсем правильной форме составил. Но суть вы все-равно ведь улавили. А на счёт left join объяснить на пальцах для этого примера, а то у меня конец рабочего дня и я не совсем понимаю как в данном случае этот left join приделать

2 Sergey Ch
Пробовал пока не дотумкал до причин, указанных -=AlexiS=-
...
Рейтинг: 0 / 0
Помогите с UPDATE FROM
    #33866145
foll-fill
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Чуть изменил и получилось чего хотел, но хотелось бы более элегантно и одним запросом, может кто знает как это можно сделать (если можно)

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
INSERT INTO curTax (n_npl,all_all,) VALUES ('0', 0 )

Update curTaxWorkPeriod ;
	Set curTaxWorkPeriod.all_p2 = curTaxWorkPeriod.all_all    -T1.all_all;
	From curTax T1;
	Where  (T1.period_id= 1  ;
	And  T1.factory_name=curTaxWorkPeriod.factory_name) ;
	OR   T1.n_npl='0' ;
	AND curTaxWorkPeriod.n_npl='4'

delete from curTax where n_npl='0'
...
Рейтинг: 0 / 0
Помогите с UPDATE FROM
    #33866181
-=AlexiS=-
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Пардон , сгоряча про left написал, нельзя там лефтов в условиях
нужно делать через вложеный запрос
примерно так

Код: plaintext
1.
2.
3.
4.
5.
6.
Update curTaxWorkPeriod ;
Set curTaxWorkPeriod.all_p2 = curTaxWorkPeriod.all_all ;
-NVL( select t1.all_all From curTax T1 Where  T1.period_id= 1  ;
And  T1.factory_name=curTaxWorkPeriod.factory_name ;
), 0 ) ;
where  curTaxWorkPeriod.n_npl='4'
не проверял - так что если будут ошибочки- поправьте
...
Рейтинг: 0 / 0
Помогите с UPDATE FROM
    #33866190
-=AlexiS=-
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
во блин скобку в подзапросе забыл
Код: plaintext
1.
2.
3.
4.
5.
Update curTaxWorkPeriod ;
Set curTaxWorkPeriod.all_p2 = curTaxWorkPeriod.all_all ;
-NVL( (select t1.all_all From curTax T1 Where  T1.period_id= 1  ;
And  T1.factory_name=curTaxWorkPeriod.factory_name ;
), 0 ) ;
where  curTaxWorkPeriod.n_npl='4'
...
Рейтинг: 0 / 0
Помогите с UPDATE FROM
    #33866256
foll-fill
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
2-=AlexiS=-
с одним вложенным запросом нормально отрабатывает и такой вариант я уже пробывал, а вот, допустим введем еще одни минус где надо будет выполнять подзапрос и Fox пожалуется, что слишком сложно для него
...
Рейтинг: 0 / 0
Помогите с UPDATE FROM
    #33866394
-=AlexiS=-
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну тогда несколько вариантов
-1-
***
Получить курсор , в котором будут все необходимые поля для "минусов". Ясно дело что получить этот курсор нужно будет с помощью left jion. И апдейтится уже из него.
ну типа

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
select curTaxWorkPeriod.factory_name,;
nvl(curTax.all_all, 0 ) as all_all,nvl(curTax.all_all1) as all_all1 ;
nvl(curTax_1.all_1, 0 ) as all_1,nvl(curTax_1.all_2) as all_1 ;
from curTaxWorkPeriod ;
left join curTax on curTax.period_id= 1  ;
And  curTax.factory_name=curTaxWorkPeriod.factory_name ;
left join curTax_1 on curTax_1.period_id= 1  ;
And  curTax_1.factory_name=curTaxWorkPeriod.factory_name ;
into cursor t1

Update curTaxWorkPeriod ;
Set curTaxWorkPeriod.all_p2 = curTaxWorkPeriod.all_all   -T1.all_all;
-T1.all_all1;
-T1.all_1;
-T1.all_2;
From T1;
Where  T1.factory_name=curTaxWorkPeriod.factory_name ;
AND curTaxWorkPeriod.n_npl='4'
***
-2-
***
Разбить все на 2 апдейта -
1 - такой как указан в твоем первом посте.
а второй
Код: plaintext
1.
2.
Update curTaxWorkPeriod ;
set  curTaxWorkPeriod.all_p2 = curTaxWorkPeriod.all_all ;
where curTaxWorkPeriod.all_p2 = 0  and curTaxWorkPeriod.n_npl='4'
***
-3-
***
Пройтись по таблице curTaxWorkPeriod сканом
с поиском данных в связаных таблицах по Locate
ну и с соответствующим replace/update
***
По всякому это лучше чем в таблицу добавлять/удалять

Хотя незная точной постановки тяжело что-то советовать.
...
Рейтинг: 0 / 0
9 сообщений из 9, страница 1 из 1
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Помогите с UPDATE FROM
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]