In this case $system.SQL.DATEDIFF is not suitable:
USER>w $system.SQL.DATEDIFF("yy", $zdh("30.12.1990",4), $zdh("01.01.1991",4))
1
USER>w ($ZD($zdh("01.01.1991",4),8)-$ZD($zdh("30.12.1990",4),8))\10000
0- Log in to post comments
In this case $system.SQL.DATEDIFF is not suitable:
USER>w $system.SQL.DATEDIFF("yy", $zdh("30.12.1990",4), $zdh("01.01.1991",4))
1
USER>w ($ZD($zdh("01.01.1991",4),8)-$ZD($zdh("30.12.1990",4),8))\10000
0See Sample.Person in "SAMPLES".
/// Person's age.<br>
/// This is a calculated field whose value is derived from <property>DOB</property>.
Property Age As %Integer [ Calculated, SqlComputeCode = { Set {Age}=##class(Sample.Person).CurrentAge({DOB})}, SqlComputed, SqlComputeOnChange = DOB ];
/// This class method calculates a current age given a date of birth <var>date</var>.
ClassMethod CurrentAge(date As %Date = "") As %Integer [ CodeMode = expression ]
{
$Select(date="":"",1:($ZD($H,8)-$ZD(date,8)\10000))
}The default ciphersuite string has changed to include new options and is now: ALL:!aNULL:!eNULL:!EXP:!SSLv2So the documentation is outdated?
All correctly, this is what I had in mind.
Quote:
The Find Global String page enables you to find a given string in the subscripts1 or in the values2 of selected3 globals.
You can select all the globals of the namespace. In this case, the search will be performed across the database. In the search results you will get including the name of global.
Look features Caché Monitor.
Class upload.fileOne Extends %ZEN.Component.page
{
Parameter DOMAIN = "DC";
XData Style
{
<style type="text/css">
</style>
}
XData Contents [ XMLNamespace = "http://www.intersystems.com/zen" ]
{
<page xmlns="http://www.intersystems.com/zen" title="Upload file using XMLHttpRequest" labelPosition="left">
<hgroup cellVAlign="bottom">
<fileUpload label="Select the file" id="fileToUpload" onchange="zenPage.fileSelected()"/>
<button caption="Upload" onclick="zenPage.uploadFile();"/>
</hgroup>
<label id="fileType" label="Type: "/>
<label id="fileName" label="Name: "/>
<label id="fileSize" label="Size: "/>
<html>
<div id="progressNumber">%</div>
<progress id="progressValue" value="0" max="100.0"></progress>
</html>
</page>
}
ClientMethod uploadFile() [ Language = javascript ]
{
var fd = new FormData();
fd.append('fUpload', zen('fileToUpload').findElement('control').files[0]);
var xhr = new XMLHttpRequest();
xhr.upload.addEventListener('progress', this.uploadProgress, false);
xhr.addEventListener('load', this.uploadComplete, false);
xhr.addEventListener('error', this.uploadFailed, false);
xhr.addEventListener('abort', this.uploadCanceled, false);
xhr.open('POST', 'upload.fileOne.cls');
xhr.send(fd);
}
ClientMethod uploadProgress(evt) [ Language = javascript ]
{
if (evt.lengthComputable) {
var percentComplete = Math.round(evt.loaded * 100 / evt.total);
document.getElementById('progressNumber').innerHTML = percentComplete.toString() + '%';
document.getElementById('progressValue').value = percentComplete;
}
else {
document.getElementById('progressNumber').innerHTML = $$$Text('Cannot compute');
}
}
ClientMethod uploadComplete(evt) [ Language = javascript ]
{
zenAlert($$$Text('The upload is complete.'));
}
ClientMethod uploadFailed(evt) [ Language = javascript ]
{
zenAlert($$$Text('An error occurred when trying to upload the file.'));
}
ClientMethod uploadCanceled(evt) [ Language = javascript ]
{
zenAlert($$$Text('The upload was canceled by the user or the browser dropped the connection.'));
}
ClientMethod fileSelected() [ Language = javascript ]
{
var file = zen('fileToUpload').findElement('control').files[0];
if (file) {
var fileSize = 0;
if (file.size > 1024 * 1024)
fileSize = (Math.round(file.size * 100 / (1024 * 1024)) / 100).toString() + $$$Text('MB');
else
fileSize = (Math.round(file.size * 100 / 1024) / 100).toString() + $$$Text('KB');
zenSetProp('fileType','value',file.type);
zenSetProp('fileName','value',file.name);
zenSetProp('fileSize','value',fileSize);
}
}
ClassMethod %OnPreHTTP() As %Boolean [ ServerOnly = 1 ]
{
#dim %request As %CSP.Request
#dim stream As %CSP.BinaryStream=%request.GetMimeData("fUpload")
if $IsObject(stream) {
#; here you do with the received file useful work
/*
set ^tmp("filename")=stream.FileName
set ^tmp("filesize")=stream.Size
*/
quit $$$NO
}
quit $$$YES
}
}Class upload.fileMany Extends %ZEN.Component.page
{
Parameter DOMAIN = "DC";
XData Style
{
<style type="text/css">
.ok {
color:green;
}
#dropZone {
width: 360px;
height: 125px;
border: dashed 2px #ccc;
background-color: #fefefe;
color: #ccc;
text-align: center;
padding: 125px 0 0 0;
}
</style>
}
XData Contents [ XMLNamespace = "http://www.intersystems.com/zen" ]
{
<page xmlns="http://www.intersystems.com/zen" title="Upload immediately multiple files using XMLHttpRequest">
<html id="dropZone">Drag files here or click below</html>
<hgroup cellVAlign="bottom">
<html id="selectFiles" label="Choose the files">
<input type="file" class="fileUpload" id="fileToUpload" onchange="zenPage.fileSelected(document.getElementById('fileToUpload').files)" multiple="multiple" />
</html>
<button caption="Clear" title="Clear the queue" onclick="zenPage.clearList();"/>
<spacer width="10"/>
<button caption="Upload" title="Upload files to the server" onclick="zenPage.uploadFile();"/>
</hgroup>
<fieldSet legend="Files waiting to upload">
<html id="holder"/>
</fieldSet>
</page>
}
ClientMethod clearList() [ Language = javascript ]
{
fileQueue=[];
zen('holder').getEnclosingDiv().innerHTML='';
zen('selectFiles').refreshContents();
}
ClientMethod fileSelected(files) [ Language = javascript ]
{
var holder = zen('holder').getEnclosingDiv();
for (var i = 0; i < files.length; i++) {
var file = files[i];
var fileSize = 0;
if (file.size > 1024 * 1024)
fileSize = (Math.round(file.size * 100 / (1024 * 1024)) / 100).toString() + $$$Text('MB');
else
fileSize = (Math.round(file.size * 100 / 1024) / 100).toString() + $$$Text('KB');
var divInfo = document.createElement('div');
divInfo.innerHTML=file.name+' ('+file.type+') - '+fileSize;
holder.appendChild(divInfo);
var divProgN = document.createElement('div');
divProgN.id='progressNumber'+i;
divProgN.innerHTML='%';
holder.appendChild(divProgN);
var prog = document.createElement('progress');
prog.id='progressValue'+i;
prog.max='100.0';
prog.value='0';
holder.appendChild(prog);
fileQueue.push({i:i,file:file});
}
}
ClientMethod uploadFile() [ Language = javascript ]
{
while (fileQueue.length > 0) {
var item=fileQueue.pop();
uploadFile(item.file,item.i);
}
}
ClientMethod onloadHandler() [ Language = javascript ]
{
if (typeof FileReader == "undefined") zenAlert($$$Text('Sorry, your browser does not support File API, so this demo will not work correctly'));
fileQueue = new Array();
uploadFile = function (file, i) {
var xhr = new XMLHttpRequest(), upload = xhr.upload, fd = new FormData();
fd.append('fUpload', file);
upload.addEventListener('progress',
function (evt) {
if (evt.lengthComputable) {
var percentComplete = Math.round(evt.loaded * 100 / evt.total);
document.getElementById('progressNumber'+i).innerHTML = percentComplete.toString() + '%';
document.getElementById('progressValue'+i).value = percentComplete;
}
else {
document.getElementById('progressNumber'+i).innerHTML = $$$Text('Cannot compute');
}
}, false);
upload.addEventListener('load', function (ev) {
var c=document.getElementById('progressNumber'+i);
c.className='ok';
c.innerHTML='OK';
}, false);
upload.addEventListener('error', function (ev) {zenAlert($$$Text('An error occurred when trying to upload the file.'));}, false);
upload.addEventListener('abort', function (ev) {zenAlert($$$Text('The upload was canceled by the user or the browser dropped the connection.'));}, false);
xhr.open('POST','upload.fileMany.cls');
xhr.setRequestHeader('Cache-Control', 'no-cache');
xhr.setRequestHeader('X-Requested-With', 'XMLHttpRequest');
xhr.send(fd);
}
dropZone=zen('dropZone').getEnclosingDiv();
dropZone.addEventListener('dragenter', function(ev){
ev.stopPropagation();
ev.preventDefault();
}, false);
dropZone.addEventListener('dragleave', function(ev){
ev.stopPropagation();
ev.preventDefault();
this.style['backgroundColor'] = '#FEFEFE';
this.style['borderColor'] = '#CCC';
this.style['color'] = '#CCC';
}, false);
dropZone.addEventListener('dragover', function(ev){
ev.stopPropagation();
ev.preventDefault();
this.style['backgroundColor'] = '#F0FCF0';
this.style['borderColor'] = '#3DD13F';
this.style['color'] = '#3DD13F';
}, false);
dropZone.addEventListener('drop', function(ev){
ev.stopPropagation();
ev.preventDefault();
this.style['backgroundColor'] = '#FEFEFE';
this.style['borderColor'] = '#CCC';
this.style['color'] = '#CCC';
zenPage.fileSelected(ev.dataTransfer.files);
}, false);
}
ClassMethod %OnPreHTTP() As %Boolean [ ServerOnly = 1 ]
{
#dim %request As %CSP.Request
#dim stream As %CSP.BinaryStream=%request.GetMimeData("fUpload")
if $IsObject(stream) {
#; here you do with the received file useful work
/*
set ^tmp("filename")=stream.FileName
set ^tmp("filesize")=stream.Size
*/
quit $$$NO
}
quit $$$YES
}
}Of course you can do the same on CSP.
See aside iFind.
I long ago did the tests, using Bible, at searching for of any substring.
select Id, Para from BookPara where Para like '%огон%'
select Id, Para from BookPara where id %FIND search_index(ParaStemmedI,'*огон*',1)
| The number of found rows | Performance (sec.) | Global references | |
|---|---|---|---|
| without an index | 287 | 0.518 | 151845 |
| with index | 287 | 0.009 | 1006 |
The difference is obvious.
<html>
<body>
<script language="cache" runat="server">
if %request.ContentType="multipart/form-data" {
s stream=%request.MimeData("oFile1",1)
s file=##class(%Stream.FileBinary).%New()
s file.Filename="c:\InterSystems\"_##class(%File).GetFilename(stream.FileName)
d file.CopyFromAndSave(stream)
}
</script>
<br>
<FORM NAME="oForm" ENCTYPE="multipart/form-data" METHOD="post">
<INPUT TYPE="file" NAME="oFile1"/>
<INPUT TYPE="submit" VALUE="Upload File">
</FORM>
</body>
</html><!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge"/>
<meta name="viewport" content="width=device-width, initial-scale=1.0,maximum-scale=1, user-scalable=no"/>
<title>Uploading a file from the client to the server without reloading the page</title>
<script type="text/javascript" src="jquery.min.js"></script>
<script type="text/javascript" src="js/vendor/jquery.ui.widget.js"></script>
<script type="text/javascript" src="js/jquery.iframe-transport.js"></script>
<script type="text/javascript" src="js/jquery.fileupload.js"></script>
<script type="text/javascript">
$(function(){
$('#fileupload').fileupload();
});
</script>
<script language="cache" runat="server">
if (%request.IsDefinedMimeData("files[]",1) ) {
s stream=%request.GetMimeData("files[]")
s file=##class(%Stream.FileBinary).%New()
s file.Filename="c:\InterSystems\"_stream.FileName
d file.CopyFromAndSave(stream)
}
</script>
</head>
<body>
#($H)#<input id="fileupload" type="file" name="files[]" data-url="#(%request.PageName)#" multiple data-sequential-uploads="false">
</body>
</html>Class dc.fileuploadajax Extends %ZEN.Component.page
{
XData Contents [ XMLNamespace = "http://www.intersystems.com/zen" ]
{
<page xmlns="http://www.intersystems.com/zen" title="Uploading a file from the client to the server without reloading the page">
<group labelPosition="left">
<text label="Current date/time on the server:" value="#(%this.%Eval($ZDT($H)))#"/>
</group>
<form enctype="multipart/form-data" target="upload_target" labelPosition="left">
<text label="Name:" name="proc"/>
<fileUpload name="file" label="Select a file:"/>
<submit caption="Upload"/>
<iframe name="upload_target" hidden="true"/>
</form>
<fieldSet legend="Information about a previously uploaded file" labelPosition="left">
<text id="proc" label="Name"/>
<text id="fileSize" label="File size"/>
<text id="fileName" label="File name"/>
<button caption="Refresh" onclick="zenPage.GetFileInfo();"/>
</fieldSet>
</page>
}
ClassMethod %OnSubmit(pSubmit As %ZEN.Submit) As %Status
{
#dim %session As %CSP.Session
#dim stream As %CSP.BinaryStream=pSubmit.%GetStream("file")
if $IsObject(stream) {
set %session.Data("fileSize")=stream.Size
set %session.Data("fileName")=stream.FileName
}
set %session.Data("proc")=pSubmit.%GetValue("proc")
quit $$$OK
}
ClassMethod GetFileInfo() [ ZenMethod ]
{
&js<
zenSetProp('proc','value',#(..QuoteJS(%session.Data("proc")))#);
zenSetProp('fileSize','value',#(..QuoteJS(%session.Data("fileSize")))#);
zenSetProp('fileName','value',#(..QuoteJS(%session.Data("fileName")))#);
>
}
}If you want, I can give ZEN-examples of asynchronous uploading of immediately several files using the File API, but this will only work in new browsers.
The following corrected code works for me:
ClassMethod WriteNodes(myfile As %String)
{
set status=##class(%XML.TextReader).ParseFile(myfile,.textreader)
if $$$ISERR(status) {do $System.Status.DisplayError(status) quit}
set ptemp=##class(%Stream.FileCharacter).%New()
set ptemp.Filename="C:\IT\50_TestIn\warddata1.txt"
//check status
//iterate through document, node by node
while textreader.Read()
{
Do ptemp.Write("Node " _ textreader.seq _ " is a(n) ")
Do ptemp.Write(textreader.NodeType _ " ")
If textreader.Name'=""
{
Do ptemp.Write( "named: "_ textreader.Name)
}
Else
{
Do ptemp.Write( "and has no name")
}
Do ptemp.Write( " path: " _ textreader.Path)
If textreader.Value'=""
{
Do ptemp.Write( " value: " _ textreader.Value)
}
Do ptemp.WriteLine()
}
Do ptemp.%Save()
}The method Write expects one parameter but you pass a few, and therefore an error occurs.
set ptemp=##class(%GlobalCharacterStream).%New()set ptemp=##class(%Stream.FileCharacter).%New() set ptemp.Filename="C:\IT\50_TestIn\warddata1.txt"
set adapter = ##class(%File).%New("C:\IT\50_TestIn\warddata1.txt") set status = adapter.Write(ptemp)set status = ptemp.%Save()
No, on specified link provides examples for Unix.
Possible prevent duplicates.
Yes, е.g. for Windows:
<cache-install-dir>\httpd\bin\httpd -k stop -n <instname>httpd
<cache-install-dir>\httpd\bin\httpd.exe -k uninstall -n <instname>httpd
C:\Program Files\Apache\bin\httpd.exe -k install -n <instname>httpd
Yes. This is solution on the original question "How to find duplicates?"
Class Test.Duplicates Extends %Persistent
{
Index iText On (Text(KEYS), Text(ELEMENTS)) [ Type = bitmap ];
Property Text As %String(MAXLEN = 2000);
ClassMethod TextBuildValueArray(
v,
ByRef arr) As %Status
{
#define sizeOfChunk 400
i v="" {
s arr("null")=v
}else{
s hasDupl=$$$YES
f i=1:1:$l(v)\$$$sizeOfChunk+($l(v)#$$$sizeOfChunk>0) {
s arr(i)=$e(v,1,$$$sizeOfChunk),$e(v,1,$$$sizeOfChunk)=""
s:hasDupl&&'$d(^Test.DuplicatesI("iText"," "_i,##class(%Collation).SqlUpper(arr(i)))) hasDupl=$$$NO
}
s:hasDupl arr("hasDupl")=""
}
q $$$OK
}
ClassMethod Test()
{
;d ##class(Test.Duplicates).Test()
d ..%KillExtent()
s text=##class(%PopulateUtils).StringMin(2000,2000)
&sql(insert into Test.Duplicates(Text)
select 'ab'
union all select 'abc' union all select 'abc'
union all select 'abe' union all select 'abe' union all select 'abe'
union all select null union all select null
union all select :text union all select :text)
d $SYSTEM.SQL.PurgeForTable($classname()),
$system.SQL.TuneTable($classname(),$$$YES),
$system.OBJ.Compile($classname(),"cu-d")
s sql(1)="select %ID,$extract(Text,1,10) Text10 from Test.Duplicates",
sql(2)="select * from Test.Duplicates where FOR SOME %ELEMENT(Text) (%KEY='null')",
sql(3)="select %ID,$extract(Text,1,10) HasDupl_Text10_All from Test.Duplicates where FOR SOME %ELEMENT(Text) (%KEY='hasdupl')",
sql(4)="select distinct $extract(%exact(Text),1,10) HasDupl_Text10 from Test.Duplicates where FOR SOME %ELEMENT(Text) (%KEY='hasdupl')"
f i=1:1:$o(sql(""),-1) w !,sql(i),!! d ##class(%SQL.Statement).%ExecDirect(,sql(i)).%Display() w !,"---------",!
}
}Result:
USER>d ##class(Test.Duplicates).Test() select %ID,$extract(Text,1,10) Text10 from Test.Duplicates ID Text10 1 ab 2 abc 3 abc 4 abe 5 abe 6 abe 7 8 9 QfgrABXjbT 10 QfgrABXjbT 10 Rows(s) Affected --------- select * from Test.Duplicates where FOR SOME %ELEMENT(Text) (%KEY='null') ID Text 7 8 2 Rows(s) Affected --------- select %ID,$extract(Text,1,10) HasDupl_Text10_All from Test.Duplicates where FOR SOME %ELEMENT(Text) (%KEY='hasdupl') ID HasDupl_Text10_All 3 abc 5 abe 6 abe 10 QfgrABXjbT 4 Rows(s) Affected --------- select distinct $extract(%exact(Text),1,10) HasDupl_Text10 from Test.Duplicates where FOR SOME %ELEMENT(Text) (%KEY='hasdupl') HasDupl_Text10 abc abe QfgrABXjbT 3 Rows(s) Affected ---------
Notes:
Slide #7. You touched on a very sore subject. As I understand you!
Methods %FileIndices and %SaveIndices marked as [Internal].
Functional of %BuildIndices more than enough.
Another variants:
#Dim sc As %Status = $$$OK s:SQLCODE sc = ##class(%Exception.SQL).CreateFromSQLCODE(SQLCODE,%msg).AsStatus() s:SQLCODE sc = $system.Error.FromSQLCode(SQLCODE,%msg).Status
It should also be noted the %sqlcontext, so final code will look as follows:
if SQLCODE {
set:$IsObject($get(%sqlcontext)) %sqlcontext.%SQLCODE=SQLCODE, %sqlcontext.%Message=$get(%msg)
set sc=$$$ERROR($$$SQLCode,SQLCODE,$g(%msg))
} else { set sc=$$$OK }There is a difference:
| Name | Home_Street |
|---|---|
| Harrison,Greta U. | 9428 Madison Place |
| Leiberman,Emma L. | 9428 Maple Blvd |
| Name | Home_Street |
|---|---|
| Leiberman,Emma L. | 9428 Maple Blvd |
| Harrison,Greta U. | 9428 Madison Place |
See ISCQT.INC and %occUtility.inc:
QT(x) Q $S(x'[$C(34):x,1:$P(x,$C(34))_$C(34,34)_$$QT($P(x,$C(34),2,$L(x)+1))) or $e($$$quote(s),2,*-1)
Isn't it easier to use the built function StringMin, especially when its the code does exactly the same thing?
USER>w $length(##class(%PopulateUtils).StringMin(100,100)) 100
Source code:
ClassMethod StringMin(
minlen As %Integer = 1,
maxlen As %Integer = 1) As %String [ ProcedureBlock = 1 ]
{
if maxlen '< minlen {
set len=$$$PRand(maxlen-minlen+1)+minlen,
string=""
for i=1:1:len {
Set charn=$s($$$PRand(2):$$$PRand(26)+65,1:$$$PRand(26)+97),
string=string_$s(charn<123:$c(charn),1:" ")
}
quit string
} else { quit "" }
}Class dc.demo Extends %Persistent
{
Property ChildPrice As %Library.Float;
ClassMethod Test()
{
;d ##class(dc.demo).Test()
d ..%KillExtent()
s obj=..%New()
s obj.ChildPrice=2.56
d obj.%Save()
&sql(select ChildPrice into :ChildPrice from dc.demo where %ID=1)
w ChildPrice,!
}
}
My result:
USER>d ##class(dc.demo).Test()
2.56
What will be the result you have?
Also check the settings for the format of the data types in your tool (DbVisualizer, Caché Monitor, WinSQL, SQuirreL SQL, etc.), in which you make a selection.Synchronous and Asynchronous Methods
ClientMethod onunloadHandler() [ Language = javascript ]
{
this.SomeZenMethod();
}
ClassMethod SomeZenMethod() As %Status [ ZenMethod ]
{
// to do some work
quit $$$OK
}ClientMethod onunloadHandler() [ Language = javascript ]
{
var old = zenSynchronousMode;
zenSynchronousMode = true;
this.SomeZenMethod();
zenSynchronousMode = old;
}
ClassMethod SomeZenMethod() [ ZenMethod ]
{
// to do some work
}