#database #foxpro
#База данных #foxpro
Вопрос:
Я хочу обновить множественный баланс в соответствии с их номером счета-фактуры всего за один запрос. Но приведенный ниже код выглядит так, как будто FoxPro не принимает его.
PS: я использую Visual FoxPro 6 только в качестве базы данных на моем классическом веб-сайте ASP.
UPDATE accounts_receivables SET balance =
CASE invoice_no
WHEN 3 THEN 6
WHEN 4 THEN 8
ELSE balance
END
WHERE invoice_no IN (3,4)
Ответ №1:
Вместо этого вы должны использовать функцию ICASE(). Вот так:
UPDATE accounts_receivables SET balance =
ICASE (
invoice_no = 3, 6,
invoice_no = 4, 8,
"balance"
)
WHERE invoice_no IN (3,4)
Комментарии:
1. FoxPro сообщает, что «Команда содержит нераспознанную фразу / ключевое слово»
2. Ошибка поставщика Microsoft OLE DB для драйверов ODBC ‘80040e37’ [Microsoft] [ODBC Visual FoxPro Driver] Файл ‘icase.prg’ не существует.
3. Какую версию Visual FoxPro вы используете? Работает в VFP 9.0 SP2
4. Протестируйте только эту строку: ? ICASE(1 1 = 2, «Первое значение true», 1 1 = 3, «Второе значение false», «Ни одно значение true»)
5. Я использую Visual FoxPro 6
Ответ №2:
Это будет работать с VFP6:
UPDATE accounts_receivables SET balance = iif(invoice_no=3, 6, iif(invoice_no=4, 8, balance)) WHERE invoice_no IN (3,4)
Это также логически совпадает с записью как:
UPDATE accounts_receivables SET balance = iif(invoice_no=3, 6, 8)) WHERE invoice_no IN (3,4)
пока вы фильтруете только по 3, 4.
Однако вы также можете использовать сделать это через VFPOLEDB (даже из VFP6), а затем вы также можете написать запрос, поддерживаемый VFP9 (поскольку вы говорите «ASP», вероятно, вы уже обращаетесь к данным через драйвер VFP вместо прямого доступа, вы можете просто использовать VFPOLEDB и использовать VFP9поддерживается SQL).
Пример в VFP (почти тот же код из ASP или VBA):
Local oCon, oCmd
oCon = Createobject("ADODB.Connection")
oCmd = Createobject("ADODB.Command")
oCmd.CommandType = 1
oCmd.CommandText = "UPDATE accounts_receivables" ;
" SET balance = icase(invoice_no=3, 6, invoice_no=4, 8, balance)" ;
" WHERE invoice_no IN (3,4)"
oCon.ConnectionString = "Provider=VFPOLEDB;Data Source=c:MyDataFolder"
oCon.Open()
oCmd.ActiveConnection = oCon
oCmd.Execute
И говоря ASP, если вы действительно имели в виду ASP.Net в этом случае, а не в старом классическом ASP, тогда вы могли бы даже сделать это проще, например:
string sql = @"UPDATE accounts_receivables
SET balance = icase(invoice_no=3, 6, invoice_no=4, 8, balance)
WHERE invoice_no IN (3,4)";
using(OleDbConnection con = new OleDbConnection(@"Provider=VFPOLEDB;Data Source=c:MyDataFolder"))
using(OleDbCommand cmd = new OleDbCommand(sql,con))
{
con.Open();
cmd.ExecuteNonQuery();
con.Close();
}
Комментарии:
1. Спасибо, чувак! Но как я могу обновить, если записей больше двух? Также я использую классический ASP
2. Возможно, icase не поддерживается VFP6, ошибка гласит: «Файл «icase.prg «не существует»
3. @iJ4419, вы можете обновить несколько, как я показал в приведенном выше коде. icase() НЕ поддерживается VFP6, однако, поскольку вы используете классический ASP, вы можете просто использовать OLEDB (VFPOLEDB) с ADODB, как я показал в приведенном выше коде. VFPOLEDB. поддерживает VFP9 и, следовательно, поддерживает SQL, совместимый с VFP9, а также iCase().
4. И, говоря несколько, если у вас много совпадений (т. Е.: 2-4, 3-6, 4-X, 5-Y …), То использование iif () или iCase () — это не правильный путь (поскольку это не путь в SQL server с использованием «case when … end»). В этом случае у вас должен быть дополнительный курсор (вероятно, созданный во время выполнения), который содержит пары значений для совпадений. Затем вы можете выполнить обновление с помощью этого курсора, используя VFPOLEDB (и, следовательно, расширенную поддержку SQL, недоступную в VFP6).
5. Я что-то сделал, и это работает только для 10 записей. Я полагаюсь на ваш код и вложенные 9 iif. Поэтому я обновляю его всякий раз, когда уже есть 10 записей, и просто сбрасываю строку. Спасибо за ваш ответ, человек! Действительно ценю это :))