SQL Pilih perubahan perilaku di Visual FoxPro 8.0

Terjemahan Artikel Terjemahan Artikel
ID Artikel: 813361 - Melihat produk di mana artikel ini berlaku.
Perbesar semua | Perkecil semua

Pada Halaman ini

RINGKASAN

Artikel ini menjelaskan perubahan perilaku SQL SELECT pernyataan eksekusi di Microsoft Visual FoxPro 8.0 (VFP8). Ini Artikel membahas mengapa perubahan ini dibuat, dan bagaimana mengubah Anda SELECT pernyataan untuk menghindari kesalahan yang mungkin Anda alami karena perubahan perilaku ini. Artikel ini juga berisi workarounds untuk ini kesalahan.

INFORMASI LEBIH LANJUT

Beberapa perubahan yang dibuat ke SQL SELECT pernyataan perilaku dalam VFP8 dibandingkan dengan versi sebelumnya dari Visual Fox Pro. Perubahan yang dirancang untuk mencegah ambigu data yang sebelumnya versi Visual FoxPro (VFP) kembali. Anda dapat mengkonfigurasi perilaku ini. Oleh karena itu, Anda dapat menggunakan Visual FoxPro 7.0 modus kompatibilitas, atau Visual FoxPro 8.0 modus. Modus default adalah Visual FoxPro 8.0.

Berikut bagian garis besar perubahan dalam kalimat dengan berbagai dari SELECT pernyataan.

Perubahan GROUP BY dan HAVING klausa

Dalam VFP8, kelompok oleh klausa daftar semua bidang dalam SQL SELECT Daftar bidang pernyataan, kecuali untuk bidang yang terdapat dalam fungsi agregat.

Dalam versi sebelumnya dari VFP, Anda mungkin tidak menerima keluaran yang Anda inginkan jika GROUP BY klausa tidak berisi semua bidang yang disebutkan dalam SQL SELECT pernyataan kecuali untuk bidang yang terkandung dalam agregat fungsi.

Perhatikan contoh berikut:

Meja pelanggan berisi informasi tentang pelanggan. Tabel ini berisi informasi seperti ID pelanggan, perusahaan, alamat, daerah dan negara. Ada lebih dari satu pelanggan untuk wilayah atau negara tertentu. Di versi sebelumnya VFP, jika Anda mencoba untuk memilih semua informasi pelanggan yang dikelompokkan menurut negara, Hasilnya menetapkan kembali catatan hanya satu pelanggan per negara. Rekaman ini biasanya terakhir pelanggan catatan dalam urutan dari penyisipan.

Menjalankan query berikut dalam versi sebelumnya dari VFP:
OPEN DATABASE Home() + 'Samples\Data\Testdata'
SELECT * FROM Customer GROUP BY Country
Kode ini berjalan dengan baik dan kembali satu catatan pelanggan per negara. Ini mungkin tidak kembali output yang Anda inginkan karena ini kembali hanya satu pelanggan per negara, dan Anda tidak memiliki kontrol atas catatan pelanggan yang kembali untuk negara tertentu.

Dalam VFP8, jenis SELECT pernyataan menyebabkan kesalahan. Jika Anda menjalankan ini SELECT pernyataan di VFP8, Anda menerima pesan galat berikut:
SQL: Kelompok oleh klausul hilang atau tidak sah.

Ini adalah kesalahan 1807.

Kode berikut berjalan VFP8 tanpa kesalahan:
SELECT Count(*), Country FROM Customer GROUP BY Country
Berikut ini adalah contoh lain:
SELECT Region, Country FROM Customer GROUP BY Country
Ini SELECT pernyataan kembali data ambigu dalam versi sebelumnya VFP, (untuk contoh, kembali wilayah tunggal rekor untuk masing-masing negara). Ini SELECT pernyataan juga menyebabkan kesalahan 1807 di VFP8. Untuk mengembalikan data yang benar, Anda dapat menulis ulang ini SELECT pernyataan sebagai berikut:
SELECT Region, Country FROM Customer GROUP BY Region, Country
Jika Anda menggunakan HAVING klausa bersama kelompok oleh klausa, kelompok oleh klausul daftar setiap bidang dalam ayat HAVING kecuali untuk bidang yang terkandung dalam fungsi agregat. Setiap pelanggaran terhadap kondisi ini menimbulkan pesan galat berikut di VFP8:
SQL: Memiliki klausul tidak sah.
Ini adalah kesalahan 1803.

Catatan Jika Anda tidak menggunakan GROUP BY klausa, dan menggunakan hanya HAVING klausa, kondisi ini tidak berlaku. Dalam kasus kemudian, HAVING klausa berperilaku sama seperti klausul WHERE, selama SQL SELECT pernyataan tidak berisi setiap fungsi agregat

The Berikut kode menggunakan HAVING klausa, dan menghasilkan kesalahan dalam VFP8. Kode ini berjalan berhasil dalam versi sebelumnya VFP, namun, mungkin tidak memberikan keluaran yang Anda inginkan.
SELECT  Count(*), Region, Country FROM  Customer GROUP BY Country HAVING NOT Empty(Region)
Ini SELECT pernyataan ini tidak sangat efektif karena ada lebih dari satu wilayah di negara masing-masing kelompok. Berikut adalah kode yang dikoreksi berjalan dengan baik di VFP8, dan menghasilkan hasil yang benar:
SELECT Count(*), Region, Country FROM  Customer GROUP BY Country, Region HAVING NOT Empty(Region)

Perubahan klausul yang berbeda


Di VFP8, Anda tidak dapat menggunakan klausul berbeda dengan Memo atau General bidang dalam SQL SELECT pernyataan. Jika Anda menjalankan sebuah klausul pilih DISTINCT? ketika bidang Anda Daftar berisi satu atau lebih Memo atau General bidang, Anda menerima pesan galat berikut:
Operasi ini tidak sah untuk Memo, umum atau gambar lapangan.
Ini adalah kesalahan 34. Untuk mengatasi kesalahan ini, bungkus Memo bidang ungkapan dalam fungsi seperti PADR() fungsi atau ALLTRIM() fungsi. Untuk informasi lebih lanjut tentang fungsi-fungsi ini, lihat Microsoft Visual FoxPro bantuan.

Menjalankan kode berikut di kedua VFP7 dan VFP8 versi untuk memverifikasi perubahan:
OPEN DATABASE Home() + 'Samples\Data\Testdata'
SELECT DISTINCT Title, Notes FROM Employee
Dalam versi sebelumnya VFP, SQL SELECT pernyataan yang dijelaskan sebelumnya dalam artikel ini berjalan tanpa kesalahan. Namun, isi dari Memo dan General bidang diabaikan. Anda menerima satu catatan data untuk judul = 'Perwakilan penjualan' dalam contoh berikut, bahkan meskipun ada lebih Catatan dalam tabel karyawan:
SELECT DISTINCT Title, Notes FROM Employee WHERE Title = 'Sales Representative'
Perilaku ini dapat mengakibatkan hasil yang tidak diharapkan jika Memo bidang adalah bidang hanya non-berbeda dalam SELECT Daftar, seperti dalam kasus sebelumnya. Jika tidak ada bidang kunci, dan Anda memiliki beberapa Memo nilai-nilai bidang di mana nilai-nilai bidang yang tersisa berbeda, biasanya Anda menerima catatan pertama atau terakhir Memo bidang yang sesuai dengan nilai-nilai berbeda bidang lain.

PILIH... UNION perubahan

DI VFP8, Anda tidak dapat menggunakan sebuah pilih... Uni pilih klausul dengan Memo atau General bidang dalam SQL SELECT pernyataan. Jika Anda menjalankan sebuah pilih... Uni pilih klausul ketika Daftar bidang Anda berisi satu atau lebih Memo atau General bidang, Anda menerima pesan galat berikut:
Operasi ini tidak sah untuk Memo, umum atau gambar lapangan.
Ini adalah kesalahan 34.

Hal ini terjadi karena Uni klausul menambahkan klausul berbeda implisit. Untuk mengatasi kesalahan ini, Anda dapat menggunakan klausul Uni semua bukannya klausa UNION.

Menjalankan berikut kode di VFP7 dan VFP8 untuk menunjukkan perubahan ini:
OPEN DATABASE Home()+'Samples\Data\Testdata'
SELECT Emp_id, Notes FROM Employee WHERE  Title = 'Sales Representative' 
UNION
SELECT Emp_id, Notes FROM Employee WHERE Title = 'Sales Manager'
Perilaku ini berkaitan dengan perilaku SELECT DISTINCT yang dibahas sebelumnya dalam artikel ini.

Dalam versi VFP sebelumnya, disebutkan sebelumnya SELECT pernyataan berjalan tanpa kesalahan, tetapi isi dari Memo atau General bidang diabaikan. Perilaku ini dapat mengakibatkan hasil yang tidak diharapkan Jika hanya non-berbeda lapangan atau bidang dalam SELECT Daftar Memo bidang. Jika tidak ada isian kunci, dan Anda memiliki beberapa Memo bidang di mana nilai-nilai bidang yang tersisa berbeda, nilai-nilai Anda biasanya menerima catatan pertama atau terakhir Memo bidang yang sesuai dengan nilai-nilai berbeda bidang lain.

PILIH... SEPERTI perubahan

Dalam VFP7 dan versi sebelumnya, "_"karakter wildcard di pilih... SEPERTI klausul ini tidak benar dilaksanakan. "_"karakter wildcard tidak digunakan untuk membandingkan kosong. Masalah ini tetap di VFP8.

Menjalankan kode berikut di VFP7 dan VFP8 untuk memverifikasi perilaku:
OPEN DATABASE Home() + 'Samples\Data\Testdata'
CREATE TABLE LikeTest (Field1 Char(5), Field2 Char(15))

INSERT Into LikeTest VALUES ('1', sys(2015))
INSERT Into LikeTest VALUES ('12 ', sys(2015))
INSERT Into LikeTest VALUES ('123', sys(2015))
INSERT Into LikeTest VALUES ('1234', sys(2015))
INSERT Into LikeTest VALUES ('234', sys(2015))
SELECT Field1 FROM LikeTest WHERE Field1 LIKE '1__'
Dalam VFP7, SELECT kembali satu catatan data dengan '123'.
Dalam VFP8, SELECT kembali 3 Catatan, '1', '12', dan '123'.

Mengkonfigurasi SQL Pilih perilaku

Kesalahan yang terjadi di VFP8 untuk berbagai SQL SELECT pernyataan akan membantu untuk memastikan bahwa data yang kembali benar. Anda dapat menjalankan salah SELECT pernyataan yang dibahas sebelumnya dalam artikel ini (yang menjalankan tanpa kesalahan dalam versi sebelumnya dari Visual FoxPro) di VFP8 tanpa kesalahan oleh menggunakan modus kompatibilitas VFP7.

Anda dapat mengkonfigurasi VFP7 kompatibilitas modus dengan mengubah perilaku SQL Data mesin. Gunakan berikut untuk mengkonfigurasi VFP8 untuk bekerja dalam modus VFP7.

Jalankan salah satu perintah berikut di VFP8:
SET ENGINEBEHAVIOR 70
-atau-
SYS(3099,70)

Catatan Seperti telah dibahas dalam bagian sebelumnya, melihat masing-masing SELECT pernyataan untuk memastikan bahwa Anda menerima hasil yang benar set Jika Anda memutuskan untuk menjalankan SELECT pernyataan dalam modus kompatibilitas VFP7.

Untuk kembali ke VFP8 modus, jalankan salah satu perintah berikut di VFP8:
SET ENGINEBEHAVIOR 80
-atau-
SYS(3099, 80)

SQL Pilih perilaku di VFP8

Untuk memastikan bahwa SQL Pilih perilaku benar di Visual FoxPro 8.0, ikuti langkah berikut:
  1. Melihat masing-masing SELECT pernyataan yang menyebabkan kesalahan, dan menentukan klausul yang menyebabkan kesalahan (memverifikasi GROUP BY, DISTINCT, UNION atau seperti).
  2. Perubahan SELECT pernyataan sedapat mungkin untuk menghindari mengubah ENGINEBEHAVIOR untuk VFP7 modus kompatibilitas.
  3. Memverifikasi bahwa Anda menerima data yang benar yang Anda harapkan dari setiap SELECT pernyataan yang menyebabkan kesalahan dan memerlukan menggunakan SET ENGINEBEHAVIOR 70.
  4. Anda dapat ENGINEBEHAVIOR secara global. Untuk melakukannya, gunakan ENGINEBEHAVIOR =<value> di file konfigurasi<b00> </b00> </value>Config.fpw.

REFERENSI

Untuk informasi lebih lanjut tentang SQL SELECT pernyataan perubahan dalam VFP8, lihat topik berikut dalam Visual FoxPro 8.0 bantuan:

"Perubahan perilaku sejak Visual FoxPro 7.0"
"SET ENGINEBEHAVIOR perintah"

Properti

ID Artikel: 813361 - Kajian Terakhir: 03 Oktober 2011 - Revisi: 2.0
Berlaku bagi:
  • Microsoft Visual FoxPro 8.0 Professional Edition
Kata kunci: 
kbmsg kbdatabase kbinfo kbmt KB813361 KbMtid
Penerjemahan Mesin
PENTING: Artikel ini diterjemahkan menggunakan perangkat lunak mesin penerjemah Microsoft dan bukan oleh seorang penerjemah. Microsoft menawarkan artikel yang diterjemahkan oleh seorang penerjemah maupun artikel yang diterjemahkan menggunakan mesin sehingga Anda akan memiliki akses ke seluruh artikel baru yang diterbitkan di Pangkalan Pengetahuan (Knowledge Base) dalam bahasa yang Anda gunakan. Namun, artikel yang diterjemahkan menggunakan mesin tidak selalu sempurna. Artikel tersebut mungkin memiliki kesalahan kosa kata, sintaksis, atau tata bahasa, hampir sama seperti orang asing yang berbicara dalam bahasa Anda. Microsoft tidak bertanggung jawab terhadap akurasi, kesalahan atau kerusakan yang disebabkan karena kesalahan penerjemahan konten atau penggunaannya oleh para pelanggan. Microsoft juga sering memperbarui perangkat lunak mesin penerjemah.
Klik disini untuk melihat versi Inggris dari artikel ini:813361

Berikan Masukan

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com