<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://pickwiki.org/index.php?action=history&amp;feed=atom&amp;title=QM.Sort.Item</id>
	<title>QM.Sort.Item - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://pickwiki.org/index.php?action=history&amp;feed=atom&amp;title=QM.Sort.Item"/>
	<link rel="alternate" type="text/html" href="https://pickwiki.org/index.php?title=QM.Sort.Item&amp;action=history"/>
	<updated>2026-04-28T23:40:47Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.43.0</generator>
	<entry>
		<id>https://pickwiki.org/index.php?title=QM.Sort.Item&amp;diff=2146&amp;oldid=prev</id>
		<title>Conversion script: link fix</title>
		<link rel="alternate" type="text/html" href="https://pickwiki.org/index.php?title=QM.Sort.Item&amp;diff=2146&amp;oldid=prev"/>
		<updated>2015-02-26T23:48:55Z</updated>

		<summary type="html">&lt;p&gt;link fix&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;Back to [[BasicSource]]&lt;br /&gt;
&lt;br /&gt;
This program allows you to change the sort order of all the data in associated multivalued attributes. You can have one or more of the attributes as keys and have different sorting criteria for each. One or more attributes can be data and are kept in synch with the key data.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
      SUBROUTINE QM.SORT.ITEM(ITEM,KEYS,DATA,PROBLEM)&lt;br /&gt;
&lt;br /&gt;
* Copyright 2013 Keith Johnson - You can use this program however you want&lt;br /&gt;
&lt;br /&gt;
*  ITEM - is a Pick record comtaining associated multivalues&lt;br /&gt;
*  KEYS - is a set of attributes&lt;br /&gt;
*         value 1 is the attribute in the record&lt;br /&gt;
*         value 2 is the sort number&lt;br /&gt;
*                 0 left justified&lt;br /&gt;
*                 1 right justified&lt;br /&gt;
*                 2 compound&lt;br /&gt;
*                 3 right justified for numbers&lt;br /&gt;
*               +16 if descending&lt;br /&gt;
*               +64 if not case sensitive&lt;br /&gt;
*  DATA - is a set of attributes for the associated multivalues&lt;br /&gt;
*&lt;br /&gt;
* This program uses the QM functions SORT and SORTNEXT&lt;br /&gt;
*      and statements SORTADD and SORTCLEAR&lt;br /&gt;
*      so it ain&amp;#039;t gonna work on yer standard Pick!&lt;br /&gt;
*&lt;br /&gt;
* An honest and earnest &amp;quot;thank you&amp;quot; to Martin Phillips.&lt;br /&gt;
*&lt;br /&gt;
* The idea is that a record contains a number of associated multivalues -&lt;br /&gt;
* some of these are keys, and others data. We wish to re-arrange the&lt;br /&gt;
* multivalues in a different order without disrupting the associations.&lt;br /&gt;
*&lt;br /&gt;
* There are speed advantages to using attributes rather than values,&lt;br /&gt;
* hence there are CONVERT lines that would be otherwise puzzling.&lt;br /&gt;
&lt;br /&gt;
      KATS = DCOUNT(KEYS,@AM)&lt;br /&gt;
      IF KATS LT 1 THEN RETURN&lt;br /&gt;
      PROBLEM = &amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
      OK = &amp;#039;0\1\2\3\16\17\18\19\64\65\66\67\80\81\82\83&amp;#039;&lt;br /&gt;
      CONVERT &amp;#039;\&amp;#039; TO @AM IN OK&lt;br /&gt;
&lt;br /&gt;
* Checking the information&lt;br /&gt;
      DIM LOCK(KATS)&lt;br /&gt;
      DIM TYPE(KATS)&lt;br /&gt;
      DIM THAT(KATS)&lt;br /&gt;
      MAXM = 0&lt;br /&gt;
      USED = &amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
      FOR KATR = 1 TO KATS&lt;br /&gt;
         ANUM = KEYS&amp;lt;KATR,1&amp;gt;&lt;br /&gt;
         IF NOT(ANUM MATCHES &amp;#039;1[[N0N]]&amp;#039;)&lt;br /&gt;
            THEN PROBLEM = &amp;#039;NON-NUMERIC KEY ATTRIBUTE&amp;#039; ; GO AWAY&lt;br /&gt;
         IF ANUM LT 1&lt;br /&gt;
            THEN PROBLEM = &amp;#039;KEY ATTRIBUTE &amp;#039;:ANUM:&amp;#039; LESS THAN 1&amp;#039; ; GO AWAY&lt;br /&gt;
         IF MAXM LT ANUM THEN MAXM = ANUM&lt;br /&gt;
&lt;br /&gt;
         SNUM = KEYS&amp;lt;KATR,2&amp;gt;&lt;br /&gt;
         IF NOT(SNUM MATCHES &amp;#039;1[[N0N]]&amp;#039;) AND SNUM NE &amp;#039;&amp;#039;&lt;br /&gt;
            THEN PROBLEM = &amp;#039;NON-NUMERIC KEY SORT&amp;#039; ; GO AWAY&lt;br /&gt;
         SNUM += 0&lt;br /&gt;
         IF SNUM GT 128 THEN SNUM -= 128      ;* we&amp;#039;ll see...&lt;br /&gt;
         LOCATE(SNUM,OK;POSN)&lt;br /&gt;
            ELSE PROBLEM = &amp;#039;INVALID KEY SORT &amp;#039;:SNUM ; GO AWAY&lt;br /&gt;
         LOCK(KATR) = SNUM&lt;br /&gt;
         TYPE(KATR) = ANUM&lt;br /&gt;
         LOCATE(ANUM,USED;POSN;&amp;#039;AR&amp;#039;) THEN&lt;br /&gt;
            PROBLEM = &amp;#039;KEY ATTRIBUTE &amp;#039;:ANUM:&amp;#039; ALREADY USED&amp;#039;&lt;br /&gt;
            GO AWAY&lt;br /&gt;
         END ELSE INS ANUM BEFORE USED&amp;lt;POSN&amp;gt;&lt;br /&gt;
      NEXT KATR&lt;br /&gt;
&lt;br /&gt;
      DATS = DCOUNT(DATA,@AM)&lt;br /&gt;
      DIM WHAT(DATS)&lt;br /&gt;
      FOR DATR = 1 TO DATS&lt;br /&gt;
         DNUM = DATA&amp;lt;DATR&amp;gt;&lt;br /&gt;
         IF NOT(DNUM MATCHES &amp;#039;1[[N0N]]&amp;#039;)&lt;br /&gt;
            THEN PROBLEM = &amp;#039;NON-NUMERIC DATA ATTRIBUTE&amp;#039; ; GO AWAY&lt;br /&gt;
         IF DNUM LT 1&lt;br /&gt;
            THEN PROBLEM = &amp;#039;DATA ATTRIBUTE &amp;#039;:ANUM:&amp;#039; LESS THAN 1&amp;#039; ; GO AWAY&lt;br /&gt;
         WHAT(DATR) = DNUM&lt;br /&gt;
         IF DNUM GT MAXM THEN MAXM = DNUM&lt;br /&gt;
         LOCATE(DNUM,USED;POSN;&amp;#039;AR&amp;#039;) THEN&lt;br /&gt;
            PROBLEM = &amp;#039;DATA ATTRIBUTE ALREADY USED&amp;#039;&lt;br /&gt;
            GO AWAY&lt;br /&gt;
         END ELSE INS DNUM BEFORE USED&amp;lt;POSN&amp;gt;&lt;br /&gt;
      NEXT DATR&lt;br /&gt;
&lt;br /&gt;
* Parse&lt;br /&gt;
      DIM ARRAY(MAXM+1)&lt;br /&gt;
      MATPARSE ARRAY FROM ITEM&lt;br /&gt;
&lt;br /&gt;
* Change values to attributes and get size&lt;br /&gt;
      LONG = 0&lt;br /&gt;
      SOME = @FALSE&lt;br /&gt;
      FOR KATR = 1 TO KATS&lt;br /&gt;
         CONVERT @VM TO @AM IN ARRAY(TYPE(KATR))&lt;br /&gt;
         CNTR = DCOUNT(ARRAY(TYPE(KATR)),@AM)&lt;br /&gt;
         IF CNTR GT LONG THEN LONG = CNTR&lt;br /&gt;
      NEXT KATR&lt;br /&gt;
      FOR DATR = 1 TO DATS&lt;br /&gt;
         CONVERT @VM TO @AM IN ARRAY(WHAT(DATR))&lt;br /&gt;
         CNTR = DCOUNT(ARRAY(WHAT(DATR)),@AM)&lt;br /&gt;
         IF CNTR GT LONG THEN LONG = CNTR&lt;br /&gt;
         IF CNTR THEN SOME = @TRUE&lt;br /&gt;
      NEXT DATR&lt;br /&gt;
&lt;br /&gt;
      IF SOME THEN LOCK(1) += 128             ;* there IS data to be retained&lt;br /&gt;
&lt;br /&gt;
      SORTVAR = SORT(KATS, MAT LOCK)&lt;br /&gt;
&lt;br /&gt;
*Stash the data in the sort variable&lt;br /&gt;
      FOR XX = 1 TO LONG&lt;br /&gt;
         MAT THAT = &amp;#039;&amp;#039;&lt;br /&gt;
         FOR KATR = 1 TO KATS&lt;br /&gt;
            THAT(KATR) = ARRAY(TYPE(KATR))&amp;lt;XX&amp;gt;&lt;br /&gt;
         NEXT KATR&lt;br /&gt;
         THIS = &amp;#039;&amp;#039;&lt;br /&gt;
         FOR DATR = 1 TO DATS&lt;br /&gt;
            THIS&amp;lt;DATR&amp;gt; = ARRAY(WHAT(DATR))&amp;lt;XX&amp;gt;&lt;br /&gt;
         NEXT DATR&lt;br /&gt;
         CONVERT @AM TO @VM IN THIS&lt;br /&gt;
         SORTADD SORTVAR, MAT THAT, THIS&lt;br /&gt;
      NEXT XX&lt;br /&gt;
&lt;br /&gt;
* Clear the data areas&lt;br /&gt;
      FOR KATR = 1 TO KATS&lt;br /&gt;
         ARRAY(TYPE(KATR)) = &amp;#039;&amp;#039;&lt;br /&gt;
      NEXT KATR&lt;br /&gt;
      FOR DATR = 1 TO DATS&lt;br /&gt;
         ARRAY(WHAT(DATR)) = &amp;#039;&amp;#039;&lt;br /&gt;
      NEXT DATR&lt;br /&gt;
&lt;br /&gt;
* Retrieve the sorted data&lt;br /&gt;
      CNTR = 0&lt;br /&gt;
      LOOP&lt;br /&gt;
         THIS = SORTNEXT(SORTVAR, MAT THAT)&lt;br /&gt;
      UNTIL STATUS()&lt;br /&gt;
         CNTR += 1&lt;br /&gt;
         FOR KATR = 1 TO KATS&lt;br /&gt;
            ARRAY(TYPE(KATR))&amp;lt;CNTR&amp;gt; = THAT(KATR)&lt;br /&gt;
         NEXT KATR&lt;br /&gt;
         CONVERT @VM TO @AM IN THIS&lt;br /&gt;
         FOR DATR = 1 TO DATS&lt;br /&gt;
            ARRAY(WHAT(DATR))&amp;lt;CNTR&amp;gt; = THIS&amp;lt;DATR&amp;gt;&lt;br /&gt;
         NEXT DATR&lt;br /&gt;
      REPEAT&lt;br /&gt;
&lt;br /&gt;
* Change all the fields to values&lt;br /&gt;
      FOR KATR = 1 TO KATS&lt;br /&gt;
         CONVERT @AM TO @VM IN ARRAY(TYPE(KATR))&lt;br /&gt;
      NEXT KATR&lt;br /&gt;
      FOR DATR = 1 TO DATS&lt;br /&gt;
         CONVERT @AM TO @VM IN ARRAY(WHAT(DATR))&lt;br /&gt;
      NEXT DATR&lt;br /&gt;
&lt;br /&gt;
* Tidy up&lt;br /&gt;
      MATBUILD ITEM FROM ARRAY&lt;br /&gt;
      SORTCLEAR SORTVAR&lt;br /&gt;
      MAT ARRAY = &amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
AWAY:&lt;br /&gt;
      RETURN&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Conversion script</name></author>
	</entry>
</feed>